// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_SCRIPT_STANDALONE_JAVASCRIPT_RUNNER_H_
#define COBALT_SCRIPT_STANDALONE_JAVASCRIPT_RUNNER_H_

#include <string>

#include "base/file_path.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/global_environment.h"
#include "cobalt/script/javascript_engine.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace script {

// This helper class can be used in simple command-line applications that will
// execute JavaScript.
class StandaloneJavascriptRunner {
 public:
  StandaloneJavascriptRunner(
      const JavaScriptEngine::Options& javascript_engine_options =
          JavaScriptEngine::Options());

  template <typename GlobalInterface>
  StandaloneJavascriptRunner(
      const JavaScriptEngine::Options& javascript_engine_options,
      const scoped_refptr<GlobalInterface>& global_object) {
    CommonInitialization(javascript_engine_options);
    global_environment_->CreateGlobalObject(global_object,
                                            environment_settings_.get());
  }

  // Executes input from stdin and echoes the result to stdout. Loops until EOF
  // is encounterd (CTRL-D).
  void RunInteractive();

  // Read the file from disk and execute the script. Echos the result to stdout.
  void ExecuteFile(const FilePath& file);

  const scoped_refptr<GlobalEnvironment>& global_environment() const {
    return global_environment_;
  }

 private:
  void CommonInitialization(
      const JavaScriptEngine::Options& javascript_engine_options);
  void ExecuteAndPrintResult(const base::SourceLocation& source_location,
                             const std::string& script);

  scoped_ptr<JavaScriptEngine> engine_;
  scoped_ptr<EnvironmentSettings> environment_settings_;
  scoped_refptr<GlobalEnvironment> global_environment_;
};
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_STANDALONE_JAVASCRIPT_RUNNER_H_
