// Copyright 2015 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.

#include "cobalt/webdriver/protocol/script.h"

#include "base/json/json_reader.h"
#include "base/json/json_writer.h"

namespace cobalt {
namespace webdriver {
namespace protocol {
namespace {
const char kScriptKey[] = "script";
const char kArgsKey[] = "args";
}

base::optional<Script> Script::FromValue(const base::Value* value) {
  const base::DictionaryValue* dictionary_value;
  if (!value->GetAsDictionary(&dictionary_value)) {
    return base::nullopt;
  }
  std::string function_body;
  if (!dictionary_value->GetString(kScriptKey, &function_body)) {
    return base::nullopt;
  }

  // Arguments are supposed to be an array where each element in the array is
  // an argument.
  // Rather than extract the arguments here, just serialize it to a string. The
  // script execution harness will extract and convert the arguments.
  const base::Value* arguments_value;
  if (!dictionary_value->Get(kArgsKey, &arguments_value)) {
    return base::nullopt;
  }

  // Ensure this is a JSON list.
  if (!arguments_value->IsType(base::Value::TYPE_LIST)) {
    return base::nullopt;
  }

  std::string arguments;
  base::JSONWriter::Write(arguments_value, &arguments);
  return Script(function_body, arguments);
}

scoped_ptr<base::Value> ScriptResult::ToValue(
    const ScriptResult& script_result) {
  return make_scoped_ptr(base::JSONReader::Read(script_result.result_string_));
}

}  // namespace protocol
}  // namespace webdriver
}  // namespace cobalt
