in source/model-generator/FieldConstraints.cpp [157:202]
std::unique_ptr<FieldConstraint> FieldConstraint::from_json(
const Json::Value& constraint) {
JsonValidation::validate_object(constraint);
std::string constraint_name =
JsonValidation::string(constraint, "constraint");
if (constraint_name == "name") {
return std::make_unique<FieldNameConstraint>(
JsonValidation::string(constraint, /* field */ "pattern"));
} else if (constraint_name == "signature") {
return std::make_unique<SignatureFieldConstraint>(
JsonValidation::string(constraint, /* field */ "pattern"));
} else if (constraint_name == "is_static") {
bool expected = constraint.isMember("value")
? JsonValidation::boolean(constraint, /* field */ "value")
: true;
return std::make_unique<IsStaticFieldConstraint>(expected);
} else if (constraint_name == "any_of" || constraint_name == "all_of") {
std::vector<std::unique_ptr<FieldConstraint>> constraints;
for (const auto& inner :
JsonValidation::null_or_array(constraint, /* field */ "inners")) {
constraints.push_back(FieldConstraint::from_json(inner));
}
if (constraint_name == "any_of") {
return std::make_unique<AnyOfFieldConstraint>(std::move(constraints));
} else {
return std::make_unique<AllOfFieldConstraint>(std::move(constraints));
}
} else if (constraint_name == "has_annotation") {
return std::make_unique<HasAnnotationFieldConstraint>(
JsonValidation::string(constraint, "type"),
constraint.isMember("pattern")
? std::optional<std::string>{JsonValidation::string(
constraint, "pattern")}
: std::nullopt);
} else if (constraint_name == "parent") {
return std::make_unique<ParentFieldConstraint>(TypeConstraint::from_json(
JsonValidation::object(constraint, /* field */ "inner")));
} else {
throw JsonValidationError(
constraint,
/* field */ "constraint",
/* expected */ "valid field constraint type");
return nullptr;
}
}