in source/model-generator/TypeConstraints.cpp [289:347]
std::unique_ptr<TypeConstraint> TypeConstraint::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<TypeNameConstraint>(
JsonValidation::string(constraint, "pattern"));
} else if (constraint_name == "extends") {
bool includes_self = constraint.isMember("include_self")
? JsonValidation::boolean(constraint, /* field */ "include_self")
: true;
return std::make_unique<ExtendsConstraint>(
TypeConstraint::from_json(
JsonValidation::object(constraint, /* field */ "inner")),
includes_self);
} else if (constraint_name == "super") {
return std::make_unique<SuperConstraint>(TypeConstraint::from_json(
JsonValidation::object(constraint, /* field */ "inner")));
} else if (constraint_name == "not") {
return std::make_unique<NotTypeConstraint>(TypeConstraint::from_json(
JsonValidation::object(constraint, /* field */ "inner")));
} else if (constraint_name == "any_of" || constraint_name == "all_of") {
std::vector<std::unique_ptr<TypeConstraint>> constraints;
for (const auto& inner :
JsonValidation::null_or_array(constraint, /* field */ "inners")) {
constraints.push_back(TypeConstraint::from_json(inner));
}
if (constraint_name == "any_of") {
return std::make_unique<AnyOfTypeConstraint>(std::move(constraints));
} else {
return std::make_unique<AllOfTypeConstraint>(std::move(constraints));
}
} else if (constraint_name == "has_annotation") {
return std::make_unique<HasAnnotationTypeConstraint>(
JsonValidation::string(constraint, "type"),
constraint.isMember("pattern")
? std::optional<std::string>{JsonValidation::string(
constraint, "pattern")}
: std::nullopt);
} else if (
constraint_name == "is_class" || constraint_name == "is_interface") {
bool expected = constraint.isMember("value")
? JsonValidation::boolean(constraint, /* field */ "value")
: true;
if (constraint_name == "is_class") {
return std::make_unique<IsClassTypeConstraint>(expected);
} else {
return std::make_unique<IsInterfaceTypeConstraint>(expected);
}
} else {
throw JsonValidationError(
constraint,
/* field */ "constraint",
/* expected */ "valid constraint type");
return nullptr;
}
}