diff options
author | reillyg <reillyg@chromium.org> | 2015-05-05 19:34:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-06 02:35:09 +0000 |
commit | 89a17f7839bfedeee84ae1dbc178fb13dfe03eba (patch) | |
tree | b82af8b83a26b7d0894a97fe5da2758ce4a014c0 /tools/json_schema_compiler/util.h | |
parent | 123d3e51878397d4a001530cfb5279bbd506bf7c (diff) | |
download | chromium_src-89a17f7839bfedeee84ae1dbc178fb13dfe03eba.zip chromium_src-89a17f7839bfedeee84ae1dbc178fb13dfe03eba.tar.gz chromium_src-89a17f7839bfedeee84ae1dbc178fb13dfe03eba.tar.bz2 |
Add support for passing errors through PopulateArrayFromList.
When a JSON schema includes an array of objects PopulateArrayFromList
calls a specialized PopulateItem instance for the generated object
type. When compiled with generate_error_messages=True the generated
type's Populate method expects to receive an error parameter. This
patch adds versions of the PopulateArrayFromList and PopulateItem
functions that pass through and provide that parameter.
This capability is required for a new manifest key that will include
an array of objects being added as part of issue 468955.
Review URL: https://codereview.chromium.org/1128523003
Cr-Commit-Position: refs/heads/master@{#328471}
Diffstat (limited to 'tools/json_schema_compiler/util.h')
-rw-r--r-- | tools/json_schema_compiler/util.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/tools/json_schema_compiler/util.h b/tools/json_schema_compiler/util.h index c27e48a..59d65d0 100644 --- a/tools/json_schema_compiler/util.h +++ b/tools/json_schema_compiler/util.h @@ -18,14 +18,31 @@ namespace util { // Populates the item |out| from the value |from|. These are used by template // specializations of |Get(Optional)ArrayFromList|. +bool PopulateItem(const base::Value& from, linked_ptr<base::Value>* out); + bool PopulateItem(const base::Value& from, int* out); +bool PopulateItem(const base::Value& from, int* out, base::string16* error); bool PopulateItem(const base::Value& from, bool* out); +bool PopulateItem(const base::Value& from, bool* out, base::string16* error); bool PopulateItem(const base::Value& from, double* out); +bool PopulateItem(const base::Value& from, double* out, base::string16* error); bool PopulateItem(const base::Value& from, std::string* out); +bool PopulateItem(const base::Value& from, + std::string* out, + base::string16* error); bool PopulateItem(const base::Value& from, std::vector<char>* out); +bool PopulateItem(const base::Value& from, + std::vector<char>* out, + base::string16* error); +bool PopulateItem(const base::Value& from, + linked_ptr<base::Value>* out, + base::string16* error); bool PopulateItem(const base::Value& from, linked_ptr<base::Value>* out); bool PopulateItem(const base::Value& from, linked_ptr<base::DictionaryValue>* out); +bool PopulateItem(const base::Value& from, + linked_ptr<base::DictionaryValue>* out, + base::string16* error); // This template is used for types generated by tools/json_schema_compiler. template <class T> @@ -40,6 +57,22 @@ bool PopulateItem(const base::Value& from, linked_ptr<T>* out) { return true; } +// This template is used for types generated by tools/json_schema_compiler with +// error generation enabled. +template <class T> +bool PopulateItem(const base::Value& from, + linked_ptr<T>* out, + base::string16* error) { + const base::DictionaryValue* dict = nullptr; + if (!from.GetAsDictionary(&dict)) + return false; + scoped_ptr<T> obj(new T()); + if (!T::Populate(*dict, obj.get(), error)) + return false; + *out = linked_ptr<T>(obj.release()); + return true; +} + // Populates |out| with |list|. Returns false if there is no list at the // specified key or if the list has anything other than |T|. template <class T> @@ -55,6 +88,23 @@ bool PopulateArrayFromList(const base::ListValue& list, std::vector<T>* out) { return true; } +// Populates |out| with |list|. Returns false and sets |error| if there is no +// list at the specified key or if the list has anything other than |T|. +template <class T> +bool PopulateArrayFromList(const base::ListValue& list, + std::vector<T>* out, + base::string16* error) { + out->clear(); + T item; + for (const base::Value* value : list) { + if (!PopulateItem(*value, &item, error)) + return false; + out->push_back(item); + } + + return true; +} + // Creates a new vector containing |list| at |out|. Returns // true on success or if there is nothing at the specified key. Returns false // if anything other than a list of |T| is at the specified key. @@ -69,6 +119,18 @@ bool PopulateOptionalArrayFromList(const base::ListValue& list, return true; } +template <class T> +bool PopulateOptionalArrayFromList(const base::ListValue& list, + scoped_ptr<std::vector<T>>* out, + base::string16* error) { + out->reset(new std::vector<T>()); + if (!PopulateArrayFromList(list, out->get(), error)) { + out->reset(); + return false; + } + return true; +} + // Appends a Value newly created from |from| to |out|. These used by template // specializations of |Set(Optional)ArrayToList|. void AddItemToList(const int from, base::ListValue* out); |