// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tools/json_schema_compiler/util.h"

#include "base/values.h"

namespace json_schema_compiler {
namespace util {

bool GetItemFromList(const base::ListValue& from, int index, int* out) {
  return from.GetInteger(index, out);
}

bool GetItemFromList(const base::ListValue& from, int index, bool* out) {
  return from.GetBoolean(index, out);
}

bool GetItemFromList(const base::ListValue& from, int index, double* out) {
  return from.GetDouble(index, out);
}

bool GetItemFromList(const base::ListValue& from, int index, std::string* out) {
  return from.GetString(index, out);
}

bool GetItemFromList(const base::ListValue& from,
                     int index,
                     linked_ptr<base::Value>* out) {
  const base::Value* value = NULL;
  if (!from.Get(index, &value))
    return false;
  *out = make_linked_ptr(value->DeepCopy());
  return true;
}

bool GetItemFromList(const base::ListValue& from, int index,
    linked_ptr<base::DictionaryValue>* out) {
  const base::DictionaryValue* dict = NULL;
  if (!from.GetDictionary(index, &dict))
    return false;
  *out = make_linked_ptr(dict->DeepCopy());
  return true;
}

void AddItemToList(const int from, base::ListValue* out) {
  out->Append(new base::FundamentalValue(from));
}

void AddItemToList(const bool from, base::ListValue* out) {
  out->Append(new base::FundamentalValue(from));
}

void AddItemToList(const double from, base::ListValue* out) {
  out->Append(new base::FundamentalValue(from));
}

void AddItemToList(const std::string& from, base::ListValue* out) {
  out->Append(new base::StringValue(from));
}

void AddItemToList(const linked_ptr<base::Value>& from,
                   base::ListValue* out) {
  out->Append(from->DeepCopy());
}

void AddItemToList(const linked_ptr<base::DictionaryValue>& from,
                   base::ListValue* out) {
  out->Append(static_cast<base::Value*>(from->DeepCopy()));
}

std::string ValueTypeToString(base::Value::Type type) {
  switch(type) {
    case base::Value::TYPE_NULL:
      return "null";
    case base::Value::TYPE_BOOLEAN:
      return "boolean";
    case base::Value::TYPE_INTEGER:
      return "integer";
    case base::Value::TYPE_DOUBLE:
      return "number";
    case base::Value::TYPE_STRING:
      return "string";
    case base::Value::TYPE_BINARY:
      return "binary";
    case base::Value::TYPE_DICTIONARY:
      return "dictionary";
    case base::Value::TYPE_LIST:
      return "list";
  }
  NOTREACHED();
  return "";
}

}  // namespace api_util
}  // namespace extensions
