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#"

Reply via email to