// Copyright 2016 Google Inc. 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_SOURCE_PROVIDER_H_
#define COBALT_SCRIPT_SOURCE_PROVIDER_H_

#include <string>

#include "base/optional.h"

namespace cobalt {
namespace script {

// Opaque type that encapsulates a source provider, as used by the JavaScript
// debugger and devtools. Objects of this type are generated when the script
// parser processes a script, and are sent to the debugger clients via the
// Debugger.scriptParsed and Debugger.scriptFailedToParse events. A source
// provider object can be accessed later using the string identifier accessed
// via the |GetScriptId| method.
// https://developer.chrome.com/devtools/docs/protocol/1.1/debugger#event-scriptParsed
// https://developer.chrome.com/devtools/docs/protocol/1.1/debugger#debugger.scriptfailedtoparse
// https://developer.chrome.com/devtools/docs/protocol/1.1/debugger#command-getScriptSource
class SourceProvider {
 public:
  virtual ~SourceProvider() {}

  // Last column of the script, for inline scripts.
  virtual base::optional<int> GetEndColumn() = 0;

  // Last line of the script, for inline scripts.
  virtual base::optional<int> GetEndLine() = 0;

  // Line where parsing failed, if any.
  virtual base::optional<int> GetErrorLine() = 0;

  // Error message from parser, if any.
  virtual base::optional<std::string> GetErrorMessage() = 0;

  // Unique identifier for this script.
  virtual std::string GetScriptId() = 0;

  // Source text of the script.
  virtual std::string GetScriptSource() = 0;

  // URL of source map associated with script, if any.
  virtual base::optional<std::string> GetSourceMapUrl() = 0;

  // First column of the script, for inline scripts.
  virtual base::optional<int> GetStartColumn() = 0;

  // First line of the script, for inline scripts.
  virtual base::optional<int> GetStartLine() = 0;

  // URL or name of the script file.
  virtual std::string GetUrl() = 0;

  // Whether this is a user extension script, optional.
  virtual base::optional<bool> IsContentScript() = 0;
};

}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_SOURCE_PROVIDER_H_
