Root Root::from_json()

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));
  }
}