| // This file is generated by ValueConversions_h.template. |
| |
| // Copyright 2016 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. |
| |
| #ifndef {{"_".join(config.protocol.namespace)}}_ValueConversions_h |
| #define {{"_".join(config.protocol.namespace)}}_ValueConversions_h |
| |
| //#include "ErrorSupport.h" |
| //#include "Forward.h" |
| //#include "Values.h" |
| |
| {% for namespace in config.protocol.namespace %} |
| namespace {{namespace}} { |
| {% endfor %} |
| |
| template<typename T> |
| struct ValueConversions { |
| static std::unique_ptr<T> fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| return T::fromValue(value, errors); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(T* value) |
| { |
| return value->toValue(); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<T>& value) |
| { |
| return value->toValue(); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<bool> { |
| static bool fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| bool result = false; |
| bool success = value ? value->asBoolean(&result) : false; |
| if (!success) |
| errors->addError("boolean value expected"); |
| return result; |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(bool value) |
| { |
| return FundamentalValue::create(value); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<int> { |
| static int fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| int result = 0; |
| bool success = value ? value->asInteger(&result) : false; |
| if (!success) |
| errors->addError("integer value expected"); |
| return result; |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(int value) |
| { |
| return FundamentalValue::create(value); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<double> { |
| static double fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| double result = 0; |
| bool success = value ? value->asDouble(&result) : false; |
| if (!success) |
| errors->addError("double value expected"); |
| return result; |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(double value) |
| { |
| return FundamentalValue::create(value); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<String> { |
| static String fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| String result; |
| bool success = value ? value->asString(&result) : false; |
| if (!success) |
| errors->addError("string value expected"); |
| return result; |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(const String& value) |
| { |
| return StringValue::create(value); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<Binary> { |
| static Binary fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| if (!value || |
| (value->type() != Value::TypeBinary && value->type() != Value::TypeString)) { |
| errors->addError("Either string base64 or binary value expected"); |
| return Binary(); |
| } |
| Binary binary; |
| if (value->asBinary(&binary)) |
| return binary; |
| String result; |
| value->asString(&result); |
| bool success; |
| Binary out = Binary::fromBase64(result, &success); |
| if (!success) |
| errors->addError("base64 decoding error"); |
| return out; |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(const Binary& value) |
| { |
| return BinaryValue::create(value); |
| } |
| }; |
| |
| template<typename T> |
| struct ValueConversions<std::vector<std::unique_ptr<T>>> { |
| static std::unique_ptr<std::vector<std::unique_ptr<T>>> fromValue(protocol::Value* value, ErrorSupport* errors) { |
| protocol::ListValue* array = ListValue::cast(value); |
| if (!array) { |
| errors->addError("array expected"); |
| return nullptr; |
| } |
| errors->push(); |
| std::unique_ptr<std::vector<std::unique_ptr<T>>> result( |
| new std::vector<std::unique_ptr<T>>()); |
| result->reserve(array->size()); |
| for (size_t i = 0; i < array->size(); ++i) { |
| errors->setName(StringUtil::fromInteger(i)); |
| auto item = ValueConversions<T>::fromValue(array->at(i), errors); |
| result->emplace_back(std::move(item)); |
| } |
| errors->pop(); |
| if (errors->hasErrors()) |
| return nullptr; |
| return result; |
| } |
| |
| static std::unique_ptr<protocol::ListValue> toValue(std::vector<std::unique_ptr<T>>* v) |
| { |
| std::unique_ptr<protocol::ListValue> result = ListValue::create(); |
| result->reserve(v->size()); |
| for (auto& item : *v) |
| result->pushValue(ValueConversions<T>::toValue(item.get())); |
| return result; |
| } |
| |
| }; |
| |
| template<typename T> |
| struct ValueConversions<std::vector<T>> { |
| static std::unique_ptr<std::vector<T>> fromValue(protocol::Value* value, ErrorSupport* errors) { |
| protocol::ListValue* array = ListValue::cast(value); |
| if (!array) { |
| errors->addError("array expected"); |
| return nullptr; |
| } |
| errors->push(); |
| std::unique_ptr<std::vector<T>> result(new std::vector<T>()); |
| result->reserve(array->size()); |
| for (size_t i = 0; i < array->size(); ++i) { |
| errors->setName(StringUtil::fromInteger(i)); |
| auto item = ValueConversions<T>::fromValue(array->at(i), errors); |
| result->emplace_back(std::move(item)); |
| } |
| errors->pop(); |
| if (errors->hasErrors()) |
| return nullptr; |
| return result; |
| } |
| |
| static std::unique_ptr<protocol::ListValue> toValue(std::vector<T>* v) |
| { |
| std::unique_ptr<protocol::ListValue> result = ListValue::create(); |
| result->reserve(v->size()); |
| for (auto& item : *v) |
| result->pushValue(ValueConversions<T>::toValue(item)); |
| return result; |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<Value> { |
| static std::unique_ptr<Value> fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| bool success = !!value; |
| if (!success) { |
| errors->addError("value expected"); |
| return nullptr; |
| } |
| return value->clone(); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(Value* value) |
| { |
| return value->clone(); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<Value>& value) |
| { |
| return value->clone(); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<DictionaryValue> { |
| static std::unique_ptr<DictionaryValue> fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| bool success = value && value->type() == protocol::Value::TypeObject; |
| if (!success) |
| errors->addError("object expected"); |
| return DictionaryValue::cast(value->clone()); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(DictionaryValue* value) |
| { |
| return value->clone(); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<DictionaryValue>& value) |
| { |
| return value->clone(); |
| } |
| }; |
| |
| template<> |
| struct ValueConversions<ListValue> { |
| static std::unique_ptr<ListValue> fromValue(protocol::Value* value, ErrorSupport* errors) |
| { |
| bool success = value && value->type() == protocol::Value::TypeArray; |
| if (!success) |
| errors->addError("list expected"); |
| return ListValue::cast(value->clone()); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(ListValue* value) |
| { |
| return value->clone(); |
| } |
| |
| static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<ListValue>& value) |
| { |
| return value->clone(); |
| } |
| }; |
| |
| {% for namespace in config.protocol.namespace %} |
| } // namespace {{namespace}} |
| {% endfor %} |
| |
| #endif // !defined({{"_".join(config.protocol.namespace)}}_ValueConversions_h) |