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