20 #include <boost/algorithm/string/join.hpp>
27 for (
auto const& elm: _obj)
28 if (_allowedFields.find(elm.first) == _allowedFields.end())
30 std::string
const comment =
"Unknown field in config: " + elm.first;
31 std::cerr << comment <<
"\n";
40 case json_spirit::obj_type:
42 case json_spirit::array_type:
44 case json_spirit::str_type:
46 case json_spirit::bool_type:
48 case json_spirit::int_type:
50 case json_spirit::real_type:
52 case json_spirit::null_type:
60 std::map<std::string, JsonFieldOptions>
const& _validationMap)
63 for (
auto const& field : _o)
65 if (!_validationMap.count(field.first))
67 std::string
const comment =
68 "Unexpected field '" + field.first +
"' in config: " + _config;
69 std::cerr << comment <<
"\n"
70 << json_spirit::write_string((json_spirit::mValue)_o,
true) <<
"\n";
76 for (
auto const vmap : _validationMap)
78 auto const& expectedFieldName = vmap.first;
79 auto const& expectedFieldPresence = vmap.second.second;
81 if (!_o.count(expectedFieldName))
83 if (expectedFieldPresence == JsonFieldPresence::Required)
85 std::string
const comment =
86 "Expected field '" + expectedFieldName +
"' not found in config: " + _config;
87 std::cerr << comment <<
"\n"
88 << json_spirit::write_string((json_spirit::mValue)_o,
true) <<
"\n";
91 else if (expectedFieldPresence == JsonFieldPresence::Optional)
96 auto const& expectedFieldTypes = vmap.second.first;
97 bool matched = expectedFieldTypes.count(_o.at(expectedFieldName).type());
100 std::vector<std::string> types;
101 for (
auto const& type : expectedFieldTypes)
103 std::string sTypes = boost::algorithm::join(types,
" or ");
105 std::string
const comment =
"Field '" + expectedFieldName +
"' is expected to be " +
106 sTypes +
", but is set to " +
109 std::cerr << comment <<
"\n"
110 << json_spirit::write_string((json_spirit::mValue)_o,
true) <<
"\n";