summaryrefslogtreecommitdiffstats
path: root/tools/json_schema_compiler
diff options
context:
space:
mode:
Diffstat (limited to 'tools/json_schema_compiler')
-rw-r--r--tools/json_schema_compiler/cc_generator.py7
-rw-r--r--tools/json_schema_compiler/test/error_generation_unittest.cc6
-rw-r--r--tools/json_schema_compiler/util.cc90
-rw-r--r--tools/json_schema_compiler/util.h62
-rw-r--r--tools/json_schema_compiler/util_cc_helper.py12
5 files changed, 162 insertions, 15 deletions
diff --git a/tools/json_schema_compiler/cc_generator.py b/tools/json_schema_compiler/cc_generator.py
index 6faac39..4fa55be 100644
--- a/tools/json_schema_compiler/cc_generator.py
+++ b/tools/json_schema_compiler/cc_generator.py
@@ -778,10 +778,9 @@ class _Generator(object):
failure_value,
is_ptr=is_ptr))
else:
- c.Sblock('if (!%s) {' % self._util_cc_helper.PopulateArrayFromList(
- 'list',
- dst_var,
- is_ptr))
+ c.Sblock('if (!%s(%s)) {' % (
+ self._util_cc_helper.PopulateArrayFromListFunction(is_ptr),
+ self._GenerateArgs(('*list', '&%(dst_var)s'))))
c.Concat(self._GenerateError(
'"unable to populate array \'%%(parent_key)s\'"'))
if is_ptr and self._generate_error_messages:
diff --git a/tools/json_schema_compiler/test/error_generation_unittest.cc b/tools/json_schema_compiler/test/error_generation_unittest.cc
index 42f9576..904b6c9 100644
--- a/tools/json_schema_compiler/test/error_generation_unittest.cc
+++ b/tools/json_schema_compiler/test/error_generation_unittest.cc
@@ -170,7 +170,8 @@ TEST(JsonSchemaCompilerErrorTest, UnableToPopulateArray) {
scoped_ptr<base::ListValue> params_value = List(
new FundamentalValue(5),
new FundamentalValue(false));
- EXPECT_TRUE(EqualsUtf16("unable to populate array 'integers'",
+ EXPECT_TRUE(EqualsUtf16(
+ "expected integer, got boolean; unable to populate array 'integers'",
GetPopulateError<ChoiceType::Integers>(*params_value)));
}
}
@@ -294,7 +295,8 @@ TEST(JsonSchemaCompilerErrorTest, OptionalUnableToPopulateArray) {
base::string16 error;
EXPECT_TRUE(OptionalChoiceType::Integers::Populate(*params_value, &out,
&error));
- EXPECT_TRUE(EqualsUtf16("unable to populate array 'integers'",
+ EXPECT_TRUE(EqualsUtf16(
+ "expected integer, got boolean; unable to populate array 'integers'",
error));
EXPECT_EQ(NULL, out.as_integer.get());
}
diff --git a/tools/json_schema_compiler/util.cc b/tools/json_schema_compiler/util.cc
index 3e36cfc..b7c4ecc 100644
--- a/tools/json_schema_compiler/util.cc
+++ b/tools/json_schema_compiler/util.cc
@@ -5,6 +5,7 @@
#include "tools/json_schema_compiler/util.h"
#include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
namespace json_schema_compiler {
@@ -14,18 +15,68 @@ bool PopulateItem(const base::Value& from, int* out) {
return from.GetAsInteger(out);
}
+bool PopulateItem(const base::Value& from, int* out, base::string16* error) {
+ if (!from.GetAsInteger(out)) {
+ if (error->length()) {
+ error->append(base::UTF8ToUTF16("; "));
+ }
+ error->append(base::UTF8ToUTF16("expected integer, got " +
+ ValueTypeToString(from.GetType())));
+ return false;
+ }
+ return true;
+}
+
bool PopulateItem(const base::Value& from, bool* out) {
return from.GetAsBoolean(out);
}
+bool PopulateItem(const base::Value& from, bool* out, base::string16* error) {
+ if (!from.GetAsBoolean(out)) {
+ if (error->length()) {
+ error->append(base::UTF8ToUTF16("; "));
+ }
+ error->append(base::UTF8ToUTF16("expected boolean, got " +
+ ValueTypeToString(from.GetType())));
+ return false;
+ }
+ return true;
+}
+
bool PopulateItem(const base::Value& from, double* out) {
return from.GetAsDouble(out);
}
+bool PopulateItem(const base::Value& from, double* out, base::string16* error) {
+ if (!from.GetAsDouble(out)) {
+ if (error->length()) {
+ error->append(base::UTF8ToUTF16("; "));
+ }
+ error->append(base::UTF8ToUTF16("expected double, got " +
+ ValueTypeToString(from.GetType())));
+ return false;
+ }
+ return true;
+}
+
bool PopulateItem(const base::Value& from, std::string* out) {
return from.GetAsString(out);
}
+bool PopulateItem(const base::Value& from,
+ std::string* out,
+ base::string16* error) {
+ if (!from.GetAsString(out)) {
+ if (error->length()) {
+ error->append(base::UTF8ToUTF16("; "));
+ }
+ error->append(base::UTF8ToUTF16("expected string, got " +
+ ValueTypeToString(from.GetType())));
+ return false;
+ }
+ return true;
+}
+
bool PopulateItem(const base::Value& from, std::vector<char>* out) {
const base::BinaryValue* binary = nullptr;
if (!from.GetAsBinary(&binary))
@@ -34,12 +85,35 @@ bool PopulateItem(const base::Value& from, std::vector<char>* out) {
return true;
}
+bool PopulateItem(const base::Value& from,
+ std::vector<char>* out,
+ base::string16* error) {
+ const base::BinaryValue* binary = nullptr;
+ if (!from.GetAsBinary(&binary)) {
+ if (error->length()) {
+ error->append(base::UTF8ToUTF16("; "));
+ }
+ error->append(base::UTF8ToUTF16("expected binary, got " +
+ ValueTypeToString(from.GetType())));
+ return false;
+ }
+ out->assign(binary->GetBuffer(), binary->GetBuffer() + binary->GetSize());
+ return true;
+}
+
bool PopulateItem(const base::Value& from, linked_ptr<base::Value>* out) {
*out = make_linked_ptr(from.DeepCopy());
return true;
}
bool PopulateItem(const base::Value& from,
+ linked_ptr<base::Value>* out,
+ base::string16* error) {
+ *out = make_linked_ptr(from.DeepCopy());
+ return true;
+}
+
+bool PopulateItem(const base::Value& from,
linked_ptr<base::DictionaryValue>* out) {
const base::DictionaryValue* dict = nullptr;
if (!from.GetAsDictionary(&dict))
@@ -48,6 +122,22 @@ bool PopulateItem(const base::Value& from,
return true;
}
+bool PopulateItem(const base::Value& from,
+ linked_ptr<base::DictionaryValue>* out,
+ base::string16* error) {
+ const base::DictionaryValue* dict = nullptr;
+ if (!from.GetAsDictionary(&dict)) {
+ if (error->length()) {
+ error->append(base::UTF8ToUTF16("; "));
+ }
+ error->append(base::UTF8ToUTF16("expected dictionary, got " +
+ ValueTypeToString(from.GetType())));
+ return false;
+ }
+ *out = make_linked_ptr(dict->DeepCopy());
+ return true;
+}
+
void AddItemToList(const int from, base::ListValue* out) {
out->Append(new base::FundamentalValue(from));
}
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);
diff --git a/tools/json_schema_compiler/util_cc_helper.py b/tools/json_schema_compiler/util_cc_helper.py
index c3acd5f..d69122d 100644
--- a/tools/json_schema_compiler/util_cc_helper.py
+++ b/tools/json_schema_compiler/util_cc_helper.py
@@ -12,18 +12,12 @@ class UtilCCHelper(object):
def __init__(self, type_manager):
self._type_manager = type_manager
- def PopulateArrayFromList(self, src, dst, optional):
- """Generates code to get an array from src into dst.
-
- src: ListValue*
- dst: std::vector or scoped_ptr<std::vector>
+ def PopulateArrayFromListFunction(self, optional):
+ """Returns the function to turn a list into a vector.
"""
populate_list_fn = ('PopulateOptionalArrayFromList' if optional
else 'PopulateArrayFromList')
- return ('%s::%s(*%s, &%s)') % (_API_UTIL_NAMESPACE,
- populate_list_fn,
- src,
- dst)
+ return ('%s::%s') % (_API_UTIL_NAMESPACE, populate_list_fn)
def CreateValueFromArray(self, src, optional):
"""Generates code to create a scoped_pt<Value> from the array at src.