absl::Status YamlToProto()

in kmscng/config/protoyaml.cc [146:180]


absl::Status YamlToProto(const YAML::Node& node,
                         google::protobuf::Message* message) {
  if (node.IsNull()) {
    return absl::OkStatus();
  }
  if (!node.IsMap()) {
    return YamlError("expected a YAML map", node.Mark(), SOURCE_LOCATION);
  }

  absl::flat_hash_set<std::string> keys_seen;
  for (auto it = node.begin(); it != node.end(); it++) {
    if (!it->first.IsScalar()) {
      return YamlError("unexpected map key", it->first.Mark(), SOURCE_LOCATION);
    }
    const std::string& key = it->first.Scalar();

    if (keys_seen.contains(key)) {
      return YamlError(
          absl::StrFormat("YAML map key %s is multiply defined", key),
          it->first.Mark(), SOURCE_LOCATION);
    }
    keys_seen.emplace(key);

    const FieldDescriptor* field =
        message->GetDescriptor()->FindFieldByName(key);
    if (!field) {
      return YamlError(
          absl::StrCat("YAML map contains an unrecognized key: ", key),
          it->first.Mark(), SOURCE_LOCATION);
    }

    RETURN_IF_ERROR(SetField(message, field, it->second));
  }
  return absl::OkStatus();
}