in source/Access.cpp [125:159]
Root Root::from_json(const Json::Value& value) {
auto root_string = JsonValidation::string(value);
if (boost::starts_with(root_string, "Argument(") &&
boost::ends_with(root_string, ")") && root_string.size() >= 11) {
auto parameter_string = root_string.substr(9, root_string.size() - 10);
auto parameter = parse_parameter_position(parameter_string);
if (!parameter) {
throw JsonValidationError(
value,
/* field */ std::nullopt,
/* expected */
fmt::format(
"`Argument(<number>)` for access path root, got `{}`",
root_string));
}
// Note: `Root::Kind::CanonicalThis` (Argument(-1)) cannot be specified in
// JSON.
return Root(Root::Kind::Argument, *parameter);
} else if (root_string == "Return") {
return Root(Root::Kind::Return);
} else if (root_string == "Leaf") {
return Root(Root::Kind::Leaf);
} else if (root_string == "Anchor") {
return Root(Root::Kind::Anchor);
} else if (root_string == "Producer") {
return Root(Root::Kind::Producer);
} else {
throw JsonValidationError(
value,
/* field */ std::nullopt,
fmt::format(
"valid access path root (`Return`, `Argument(...)`, `Leaf`, `Anchor` or `Producer`), got `{}`",
root_string));
}
}