cmJSONHelpers: Add new Bind() function

This commit is contained in:
Kyle Edwards 2020-09-23 08:50:52 -04:00
parent 8682d1b7b2
commit 3059e6aed7
2 changed files with 35 additions and 13 deletions

View File

@ -29,6 +29,9 @@ public:
template <typename M, typename F>
cmJSONObjectHelper& Bind(const cm::string_view& name, std::nullptr_t, F func,
bool required = true);
template <typename F>
cmJSONObjectHelper& Bind(const cm::string_view& name, F func,
bool required = true);
E operator()(T& out, const Json::Value* value) const;
@ -86,6 +89,14 @@ cmJSONObjectHelper<T, E>& cmJSONObjectHelper<T, E>::Bind(
required);
}
template <typename T, typename E>
template <typename F>
cmJSONObjectHelper<T, E>& cmJSONObjectHelper<T, E>::Bind(
const cm::string_view& name, F func, bool required)
{
return this->BindPrivate(name, MemberFunction(func), required);
}
template <typename T, typename E>
cmJSONObjectHelper<T, E>& cmJSONObjectHelper<T, E>::BindPrivate(
const cm::string_view& name, MemberFunction&& func, bool required)

View File

@ -37,6 +37,7 @@ enum class ErrorCode
InvalidInt,
InvalidBool,
InvalidString,
InvalidSubObject,
InvalidObject,
InvalidArray,
MissingRequired,
@ -148,15 +149,20 @@ bool testString()
bool testObject()
{
auto const subhelper =
cmJSONObjectHelper<ObjectStruct, ErrorCode>(ErrorCode::Success,
ErrorCode::InvalidSubObject)
.Bind("subfield"_s, &ObjectStruct::Field2, IntHelper);
auto const helper = cmJSONObjectHelper<ObjectStruct, ErrorCode>(
ErrorCode::Success, ErrorCode::InvalidObject)
.Bind("field1"_s, &ObjectStruct::Field1, StringHelper)
.Bind("field2"_s, &ObjectStruct::Field2, IntHelper)
.Bind("field2"_s, subhelper)
.Bind<std::string>("field3"_s, nullptr, StringHelper);
Json::Value v(Json::objectValue);
v["field1"] = "Hello";
v["field2"] = 2;
v["field2"] = Json::objectValue;
v["field2"]["subfield"] = 2;
v["field3"] = "world!";
v["extra"] = "extra";
@ -165,29 +171,34 @@ bool testObject()
ASSERT_TRUE(s1.Field1 == "Hello");
ASSERT_TRUE(s1.Field2 == 2);
v["field2"] = "wrong";
v["field2"]["subfield"] = "wrong";
ObjectStruct s2;
ASSERT_TRUE(helper(s2, &v) == ErrorCode::InvalidInt);
v.removeMember("field2");
v["field2"].removeMember("subfield");
ObjectStruct s3;
ASSERT_TRUE(helper(s3, &v) == ErrorCode::InvalidObject);
ASSERT_TRUE(helper(s3, &v) == ErrorCode::InvalidSubObject);
v["field2"] = 2;
v["field3"] = 3;
v.removeMember("field2");
ObjectStruct s4;
ASSERT_TRUE(helper(s4, &v) == ErrorCode::InvalidString);
ASSERT_TRUE(helper(s4, &v) == ErrorCode::InvalidObject);
v["field2"] = Json::objectValue;
v["field2"]["subfield"] = 2;
v["field3"] = 3;
ObjectStruct s5;
ASSERT_TRUE(helper(s5, &v) == ErrorCode::InvalidString);
v.removeMember("field3");
ObjectStruct s5;
ASSERT_TRUE(helper(s5, &v) == ErrorCode::InvalidObject);
v = "Hello";
ObjectStruct s6;
ASSERT_TRUE(helper(s6, &v) == ErrorCode::InvalidObject);
v = "Hello";
ObjectStruct s7;
ASSERT_TRUE(helper(s7, nullptr) == ErrorCode::InvalidObject);
ASSERT_TRUE(helper(s7, &v) == ErrorCode::InvalidObject);
ObjectStruct s8;
ASSERT_TRUE(helper(s8, nullptr) == ErrorCode::InvalidObject);
return true;
}