diff options
author | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-13 00:14:15 +0000 |
---|---|---|
committer | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-13 00:14:15 +0000 |
commit | 038cf35cb46df9ef18abb976f53ca8c259e89979 (patch) | |
tree | bfb6df165a2746b8be8b04a2718c7bf8549d72f1 /base/json | |
parent | 3863d40647b218dc51127754ae0b24749781fea9 (diff) | |
download | chromium_src-038cf35cb46df9ef18abb976f53ca8c259e89979.zip chromium_src-038cf35cb46df9ef18abb976f53ca8c259e89979.tar.gz chromium_src-038cf35cb46df9ef18abb976f53ca8c259e89979.tar.bz2 |
JSONValueConverter changes for custom base::Value filed parsing.
chanegs approved in http://codereview.chromium.org/10006023/
BUG=chromium-os:29052
TEST=JSONValueConverterTest.*
TBR=willchan
Review URL: https://chromiumcodereview.appspot.com/10066031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132101 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/json')
-rw-r--r-- | base/json/json_value_converter.h | 30 | ||||
-rw-r--r-- | base/json/json_value_converter_unittest.cc | 17 |
2 files changed, 46 insertions, 1 deletions
diff --git a/base/json/json_value_converter.h b/base/json/json_value_converter.h index 7764632..d296b66 100644 --- a/base/json/json_value_converter.h +++ b/base/json/json_value_converter.h @@ -205,6 +205,25 @@ class BasicValueConverter<bool> : public ValueConverter<bool> { }; template <typename FieldType> +class ValueFieldConverter : public ValueConverter<FieldType> { + public: + typedef bool(*ConvertFunc)(const base::Value* value, FieldType* field); + + ValueFieldConverter(ConvertFunc convert_func) + : convert_func_(convert_func) {} + + virtual bool Convert(const base::Value& value, + FieldType* field) const OVERRIDE { + return convert_func_(&value, field); + } + + private: + ConvertFunc convert_func_; + + DISALLOW_COPY_AND_ASSIGN(ValueFieldConverter); +}; + +template <typename FieldType> class CustomFieldConverter : public ValueConverter<FieldType> { public: typedef bool(*ConvertFunc)(const StringPiece& value, FieldType* field); @@ -368,6 +387,17 @@ class JSONValueConverter { new internal::CustomFieldConverter<FieldType>(convert_func))); } + template <typename FieldType> + void RegisterCustomValueField( + const std::string& field_name, + FieldType StructType::* field, + bool (*convert_func)(const base::Value*, FieldType*)) { + fields_.push_back(new internal::FieldConverter<StructType, FieldType>( + field_name, + field, + new internal::ValueFieldConverter<FieldType>(convert_func))); + } + void RegisterRepeatedInt(const std::string& field_name, ScopedVector<int> StructType::* field) { fields_.push_back( diff --git a/base/json/json_value_converter_unittest.cc b/base/json/json_value_converter_unittest.cc index 46b06ed..120dd48 100644 --- a/base/json/json_value_converter_unittest.cc +++ b/base/json/json_value_converter_unittest.cc @@ -25,9 +25,10 @@ struct SimpleMessage { int foo; std::string bar; bool baz; + bool bstruct; SimpleEnum simple_enum; ScopedVector<int> ints; - SimpleMessage() : foo(0), baz(false) {} + SimpleMessage() : foo(0), baz(false), bstruct(false) {} static bool ParseSimpleEnum(const StringPiece& value, SimpleEnum* field) { if (value == "foo") { @@ -40,6 +41,11 @@ struct SimpleMessage { return false; } + static bool HasFieldPresent(const base::Value* value, bool* result) { + *result = value != NULL; + return true; + } + static void RegisterJSONConverter( base::JSONValueConverter<SimpleMessage>* converter) { converter->RegisterIntField("foo", &SimpleMessage::foo); @@ -48,6 +54,9 @@ struct SimpleMessage { converter->RegisterCustomField<SimpleEnum>( "simple_enum", &SimpleMessage::simple_enum, &ParseSimpleEnum); converter->RegisterRepeatedInt("ints", &SimpleMessage::ints); + converter->RegisterCustomValueField<bool>("bstruct", + &SimpleMessage::bstruct, + &HasFieldPresent); } }; @@ -75,6 +84,7 @@ TEST(JSONValueConverterTest, ParseSimpleMessage) { " \"foo\": 1,\n" " \"bar\": \"bar\",\n" " \"baz\": true,\n" + " \"bstruct\": {},\n" " \"simple_enum\": \"foo\"," " \"ints\": [1, 2]" "}\n"; @@ -100,11 +110,13 @@ TEST(JSONValueConverterTest, ParseNestedMessage) { " \"child\": {\n" " \"foo\": 1,\n" " \"bar\": \"bar\",\n" + " \"bstruct\": {},\n" " \"baz\": true\n" " },\n" " \"children\": [{\n" " \"foo\": 2,\n" " \"bar\": \"foobar\",\n" + " \"bstruct\": \"\",\n" " \"baz\": true\n" " },\n" " {\n" @@ -123,6 +135,7 @@ TEST(JSONValueConverterTest, ParseNestedMessage) { EXPECT_EQ(1, message.child.foo); EXPECT_EQ("bar", message.child.bar); EXPECT_TRUE(message.child.baz); + EXPECT_TRUE(message.child.bstruct); EXPECT_EQ(2, static_cast<int>(message.children.size())); const SimpleMessage* first_child = message.children[0]; @@ -130,12 +143,14 @@ TEST(JSONValueConverterTest, ParseNestedMessage) { EXPECT_EQ(2, first_child->foo); EXPECT_EQ("foobar", first_child->bar); EXPECT_TRUE(first_child->baz); + EXPECT_TRUE(first_child->bstruct); const SimpleMessage* second_child = message.children[1]; ASSERT_TRUE(second_child); EXPECT_EQ(3, second_child->foo); EXPECT_EQ("barbaz", second_child->bar); EXPECT_FALSE(second_child->baz); + EXPECT_FALSE(second_child->bstruct); } TEST(JSONValueConverterTest, ParseFailures) { |