absl::Status SetScalarField()

in kmscng/config/protoyaml.cc [41:77]


absl::Status SetScalarField(Message* dest, const FieldDescriptor* field,
                            const YAML::Node& value) {
  if (!value.IsScalar()) {
    return YamlError("expected scalar node", value.Mark(), SOURCE_LOCATION);
  }
  std::string string_value = value.Scalar();
  const Reflection* reflect = dest->GetReflection();

  switch (field->type()) {
    case FieldDescriptor::Type::TYPE_STRING:
      reflect->SetString(dest, field, string_value);
      return absl::OkStatus();

    case FieldDescriptor::Type::TYPE_UINT32:
      uint32_t int_value;
      if (!absl::SimpleAtoi(string_value, &int_value)) {
        return YamlError(absl::StrCat("unexpected int value: ", string_value),
                         value.Mark(), SOURCE_LOCATION);
      }
      reflect->SetUInt32(dest, field, int_value);
      return absl::OkStatus();

    case FieldDescriptor::Type::TYPE_BOOL:
      bool bool_value;
      if (!absl::SimpleAtob(string_value, &bool_value)) {
        return YamlError(absl::StrCat("unexpected bool value: ", string_value),
                         value.Mark(), SOURCE_LOCATION);
      }
      reflect->SetBool(dest, field, bool_value);
      return absl::OkStatus();

    default:
      return NewInternalError(
          absl::StrCat("unsupported proto type: ", field->type_name()),
          SOURCE_LOCATION);
  }
}