This is an automated email from the ASF dual-hosted git repository. mgrigorov pushed a commit to branch avro-3631/fix-fixed-serialization in repository https://gitbox.apache.org/repos/asf/avro.git
commit 7b1cdd8e5a5e153db713d03b432e4784ad9fcfe6 Author: Martin Tzvetanov Grigorov <[email protected]> AuthorDate: Mon Oct 3 14:52:24 2022 +0300 AVRO-3631: Add support for ser_de Value::Fixed It is based on https://github.com/serde-rs/bytes/pull/28 which is not yet merged. Signed-off-by: Martin Tzvetanov Grigorov <[email protected]> --- lang/rust/Cargo.lock | 8 ++++++++ lang/rust/avro/Cargo.toml | 1 + lang/rust/avro/src/de.rs | 9 +++++---- lang/rust/avro/src/ser.rs | 15 +++++++++------ lang/rust/avro/src/types.rs | 17 ++++++++++------- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/lang/rust/Cargo.lock b/lang/rust/Cargo.lock index 3fb489408..721cf9514 100644 --- a/lang/rust/Cargo.lock +++ b/lang/rust/Cargo.lock @@ -52,6 +52,7 @@ dependencies = [ "rand", "regex", "serde", + "serde_bytes", "serde_json", "sha2", "snap", @@ -956,6 +957,13 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.7" +dependencies = [ + "serde", +] + [[package]] name = "serde_cbor" version = "0.11.2" diff --git a/lang/rust/avro/Cargo.toml b/lang/rust/avro/Cargo.toml index 27b865868..de9528b17 100644 --- a/lang/rust/avro/Cargo.toml +++ b/lang/rust/avro/Cargo.toml @@ -64,6 +64,7 @@ log = { default-features = false, version = "0.4.17" } num-bigint = { default-features = false, version = "0.4.3" } regex = { default-features = false, version = "1.6.0", features = ["std"] } serde = { default-features = false, version = "1.0.145", features = ["derive"] } +serde_bytes = {path = "/home/martin/git/rust/serde/bytes"} serde_json = { default-features = false, version = "1.0.85", features = ["std"] } snap = { default-features = false, version = "1.0.5", optional = true } strum = { default-features = false, version = "0.24.1" } diff --git a/lang/rust/avro/src/de.rs b/lang/rust/avro/src/de.rs index f0474015d..317f43be2 100644 --- a/lang/rust/avro/src/de.rs +++ b/lang/rust/avro/src/de.rs @@ -332,7 +332,7 @@ impl<'a, 'de> de::Deserializer<'de> for &'a Deserializer<'de> { Value::String(ref s) => visitor.visit_bytes(s.as_bytes()), Value::Bytes(ref bytes) | Value::Fixed(_, ref bytes) => visitor.visit_bytes(bytes), Value::Uuid(ref u) => visitor.visit_bytes(u.as_bytes()), - _ => Err(de::Error::custom("not a string|bytes|fixed")), + _ => Err(de::Error::custom("not a string|bytes|fixed|uuid")), } } @@ -595,6 +595,7 @@ pub fn from_value<'de, D: Deserialize<'de>>(value: &'de Value) -> Result<D, Erro mod tests { use pretty_assertions::assert_eq; use serde::Serialize; + use serde_bytes::ByteArray; use uuid::Uuid; use super::*; @@ -1064,16 +1065,16 @@ mod tests { } #[test] - fn test_struct_fixed_field_avro_3631() { + fn avro_3631_test_struct_fixed_field() { #[derive(Debug, Serialize, Deserialize)] struct TestStructFixedField { - field: [u8; 6], + field: ByteArray<6>, } let value = Value::Record(vec![( "field".to_string(), Value::Fixed(6, vec![0, 0, 0, 0, 0, 0]), )]); - let _deserialized: TestStructFixedField = crate::from_value(&value).unwrap(); + let _deserialized: TestStructFixedField = from_value(&value).unwrap(); } } diff --git a/lang/rust/avro/src/ser.rs b/lang/rust/avro/src/ser.rs index 477bd5a74..fb26cb183 100644 --- a/lang/rust/avro/src/ser.rs +++ b/lang/rust/avro/src/ser.rs @@ -174,7 +174,7 @@ impl<'b> ser::Serializer for &'b mut Serializer { } fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> { - Ok(Value::Bytes(v.to_owned())) + Ok(Value::Fixed(v.len(), v.to_owned())) } fn serialize_none(self) -> Result<Self::Ok, Self::Error> { @@ -487,6 +487,7 @@ mod tests { use super::*; use pretty_assertions::assert_eq; use serde::{Deserialize, Serialize}; + use serde_bytes::ByteArray; #[derive(Debug, Deserialize, Serialize, Clone)] struct Test { @@ -679,7 +680,7 @@ mod tests { #[derive(Debug, Serialize, Deserialize)] struct TestStructFixedField { - field: [u8; 6], + field: ByteArray<6>, } #[test] @@ -1005,15 +1006,17 @@ mod tests { } #[test] - fn test_to_value_fixed_field_avro_3631() { - let test = TestStructFixedField { field: [1; 6] }; + fn avro_3631_test_to_value_fixed_field() { + let test = TestStructFixedField { + field: ByteArray::new([1; 6]), + }; let expected = Value::Record(vec![( "field".to_owned(), - Value::Fixed(6, Vec::from(test.field.clone())), + Value::Fixed(6, Vec::from(test.field.clone().into_array())), )]); assert_eq!( - to_value(test).unwrap(), expected, + to_value(test).unwrap(), "error serializing fixed array" ); } diff --git a/lang/rust/avro/src/types.rs b/lang/rust/avro/src/types.rs index 657df2753..f1cd75ba5 100644 --- a/lang/rust/avro/src/types.rs +++ b/lang/rust/avro/src/types.rs @@ -958,6 +958,7 @@ mod tests { use apache_avro_test_helper::logger::{assert_logged, assert_not_logged}; use pretty_assertions::assert_eq; use serde::{Deserialize, Serialize}; + use serde_bytes::ByteArray; use uuid::Uuid; #[test] @@ -2394,14 +2395,16 @@ Field with name '"b"' is not a member of the map items"#, ); // this should pass, but doesn't } - #[derive(Debug, Serialize, Deserialize)] - struct TestStructFixedField { - field: [u8; 6], - } - #[test] - fn test_avro_3631_serialize_fixed_fields() { - let test = TestStructFixedField { field: [1; 6] }; + fn avro_3631_test_serialize_fixed_fields() { + #[derive(Debug, Serialize, Deserialize)] + struct TestStructFixedField { + field: ByteArray<6>, + } + + let test = TestStructFixedField { + field: ByteArray::new([1; 6]), + }; let value: Value = to_value(test).unwrap(); let schema = Schema::parse_str( r#"
