diff --git a/rust/test/shared/accessors_test.rs b/rust/test/shared/accessors_test.rs index 2007273f91..2a59458cd9 100644 --- a/rust/test/shared/accessors_test.rs +++ b/rust/test/shared/accessors_test.rs @@ -40,6 +40,8 @@ fn test_default_accessors() { assert_eq!(msg.default_sint64(), 46); assert_eq!(msg.default_uint32(), 43); assert_eq!(msg.default_uint64(), 44); + assert_eq!(msg.default_float(), 51.5); + assert_eq!(msg.default_double(), 52000.0); assert_eq!(msg.default_bool(), true); } @@ -134,6 +136,36 @@ fn test_optional_uint64_accessors() { assert_eq!(msg.optional_uint64(), 0); } +#[test] +fn test_optional_float_accessors() { + let mut msg = TestAllTypes::new(); + assert_eq!(msg.optional_float_opt(), None); + assert_eq!(msg.optional_float(), 0.0); + + msg.optional_float_set(Some(3.14)); + assert_eq!(msg.optional_float_opt(), Some(3.14)); + assert_eq!(msg.optional_float(), 3.14); + + msg.optional_float_set(None); + assert_eq!(msg.optional_float_opt(), None); + assert_eq!(msg.optional_float(), 0.0); +} + +#[test] +fn test_optional_double_accessors() { + let mut msg = TestAllTypes::new(); + assert_eq!(msg.optional_double_opt(), None); + assert_eq!(msg.optional_double(), 0.0); + + msg.optional_double_set(Some(-10.99)); + assert_eq!(msg.optional_double_opt(), Some(-10.99)); + assert_eq!(msg.optional_double(), -10.99); + + msg.optional_double_set(None); + assert_eq!(msg.optional_double_opt(), None); + assert_eq!(msg.optional_double(), 0.0); +} + #[test] fn test_optional_bool_accessors() { let mut msg = TestAllTypes::new(); diff --git a/src/google/protobuf/compiler/rust/accessors/accessors.cc b/src/google/protobuf/compiler/rust/accessors/accessors.cc index 482d401735..6523cd0139 100644 --- a/src/google/protobuf/compiler/rust/accessors/accessors.cc +++ b/src/google/protobuf/compiler/rust/accessors/accessors.cc @@ -55,6 +55,8 @@ std::unique_ptr AccessorGenerator::For( case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_UINT64: + case FieldDescriptor::TYPE_FLOAT: + case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_BOOL: if (field.desc().is_repeated()) return nullptr; return ForSingularScalar(field); diff --git a/src/google/protobuf/compiler/rust/naming.cc b/src/google/protobuf/compiler/rust/naming.cc index 44e4ffbcda..7bb7d491ad 100644 --- a/src/google/protobuf/compiler/rust/naming.cc +++ b/src/google/protobuf/compiler/rust/naming.cc @@ -122,6 +122,10 @@ absl::string_view PrimitiveRsTypeName(Context field) { return "u32"; case FieldDescriptor::TYPE_UINT64: return "u64"; + case FieldDescriptor::TYPE_FLOAT: + return "f32"; + case FieldDescriptor::TYPE_DOUBLE: + return "f64"; case FieldDescriptor::TYPE_BYTES: return "&[u8]"; default: @@ -143,6 +147,8 @@ bool IsSupportedFieldType(Context field) { field.desc().type() == FieldDescriptor::TYPE_SINT64 || field.desc().type() == FieldDescriptor::TYPE_UINT32 || field.desc().type() == FieldDescriptor::TYPE_UINT64 || + field.desc().type() == FieldDescriptor::TYPE_FLOAT || + field.desc().type() == FieldDescriptor::TYPE_DOUBLE || field.desc().type() == FieldDescriptor::TYPE_BYTES); }