// 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 MOJO_COMMON_VALUES_STRUCT_TRAITS_H_ #define MOJO_COMMON_VALUES_STRUCT_TRAITS_H_ #include "base/values.h" #include "mojo/common/values.mojom.h" #include "mojo/public/cpp/bindings/array_traits.h" #include "mojo/public/cpp/bindings/clone_traits.h" #include "mojo/public/cpp/bindings/map_traits.h" #include "mojo/public/cpp/bindings/struct_traits.h" #include "mojo/public/cpp/bindings/union_traits.h" namespace mojo { template <> struct ArrayTraits { using Element = std::unique_ptr; using ConstIterator = base::ListValue::const_iterator; static size_t GetSize(const base::ListValue& input) { return input.GetSize(); } static ConstIterator GetBegin(const base::ListValue& input) { return input.begin(); } static void AdvanceIterator(ConstIterator& iterator) { ++iterator; } static const Element& GetValue(ConstIterator& iterator) { return *iterator; } }; template <> struct StructTraits { static const base::ListValue& values(const base::ListValue& value) { return value; } }; template <> struct StructTraits> { static bool IsNull(const std::unique_ptr& value) { return !value; } static void SetToNull(std::unique_ptr* value) { value->reset(); } static const base::ListValue& values( const std::unique_ptr& value) { return *value; } static bool Read(common::mojom::ListValueDataView data, std::unique_ptr* value); }; template <> struct MapTraits { using Key = std::string; using Value = base::Value; using Iterator = base::DictionaryValue::Iterator; static size_t GetSize(const base::DictionaryValue& input) { return input.size(); } static Iterator GetBegin(const base::DictionaryValue& input) { return Iterator(input); } static void AdvanceIterator(Iterator& iterator) { iterator.Advance(); } static const Key& GetKey(Iterator& iterator) { return iterator.key(); } static const Value& GetValue(Iterator& iterator) { return iterator.value(); } }; template <> struct StructTraits { static const base::DictionaryValue& values( const base::DictionaryValue& value) { return value; } }; template <> struct StructTraits> { static bool IsNull(const std::unique_ptr& value) { return !value; } static void SetToNull(std::unique_ptr* value) { value->reset(); } static const base::DictionaryValue& values( const std::unique_ptr& value) { return *value; } static bool Read(common::mojom::DictionaryValueDataView data, std::unique_ptr* value); }; template <> struct CloneTraits, false> { static std::unique_ptr Clone( const std::unique_ptr& input); }; template <> struct UnionTraits { static common::mojom::ValueDataView::Tag GetTag(const base::Value& data) { switch (data.GetType()) { case base::Value::Type::NONE: return common::mojom::ValueDataView::Tag::NULL_VALUE; case base::Value::Type::BOOLEAN: return common::mojom::ValueDataView::Tag::BOOL_VALUE; case base::Value::Type::INTEGER: return common::mojom::ValueDataView::Tag::INT_VALUE; case base::Value::Type::DOUBLE: return common::mojom::ValueDataView::Tag::DOUBLE_VALUE; case base::Value::Type::STRING: return common::mojom::ValueDataView::Tag::STRING_VALUE; case base::Value::Type::BINARY: return common::mojom::ValueDataView::Tag::BINARY_VALUE; case base::Value::Type::DICTIONARY: return common::mojom::ValueDataView::Tag::DICTIONARY_VALUE; case base::Value::Type::LIST: return common::mojom::ValueDataView::Tag::LIST_VALUE; } NOTREACHED(); return common::mojom::ValueDataView::Tag::NULL_VALUE; } static common::mojom::NullValuePtr null_value(const base::Value& value) { return common::mojom::NullValuePtr(); } static bool bool_value(const base::Value& value) { bool bool_value{}; if (!value.GetAsBoolean(&bool_value)) NOTREACHED(); return bool_value; } static int32_t int_value(const base::Value& value) { int int_value{}; if (!value.GetAsInteger(&int_value)) NOTREACHED(); return int_value; } static double double_value(const base::Value& value) { double double_value{}; if (!value.GetAsDouble(&double_value)) NOTREACHED(); return double_value; } static base::StringPiece string_value(const base::Value& value) { base::StringPiece string_piece; if (!value.GetAsString(&string_piece)) NOTREACHED(); return string_piece; } static mojo::ConstCArray binary_value(const base::Value& value) { const base::BinaryValue* binary_value = nullptr; if (!value.GetAsBinary(&binary_value)) NOTREACHED(); return mojo::ConstCArray( binary_value->GetSize(), reinterpret_cast(binary_value->GetBuffer())); } static const base::ListValue& list_value(const base::Value& value) { const base::ListValue* list_value = nullptr; if (!value.GetAsList(&list_value)) NOTREACHED(); return *list_value; } static const base::DictionaryValue& dictionary_value( const base::Value& value) { const base::DictionaryValue* dictionary_value = nullptr; if (!value.GetAsDictionary(&dictionary_value)) NOTREACHED(); return *dictionary_value; } }; template <> struct UnionTraits> { static bool IsNull(const std::unique_ptr& value) { return !value; } static void SetToNull(std::unique_ptr* value) { value->reset(); } static common::mojom::ValueDataView::Tag GetTag( const std::unique_ptr& value) { return UnionTraits::GetTag( *value); } static common::mojom::NullValuePtr null_value( const std::unique_ptr& value) { return UnionTraits::null_value( *value); } static bool bool_value(const std::unique_ptr& value) { return UnionTraits::bool_value( *value); } static int32_t int_value(const std::unique_ptr& value) { return UnionTraits::int_value( *value); } static double double_value(const std::unique_ptr& value) { return UnionTraits::double_value( *value); } static base::StringPiece string_value( const std::unique_ptr& value) { return UnionTraits::string_value( *value); } static mojo::ConstCArray binary_value( const std::unique_ptr& value) { return UnionTraits::binary_value( *value); } static const base::ListValue& list_value( const std::unique_ptr& value) { return UnionTraits::list_value( *value); } static const base::DictionaryValue& dictionary_value( const std::unique_ptr& value) { return UnionTraits::dictionary_value(*value); } static bool Read(common::mojom::ValueDataView data, std::unique_ptr* value); }; } // namespace mojo #endif // MOJO_COMMON_VALUES_STRUCT_TRAITS_H_