This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new f617b8e  fix: Support deserialization of `BigDecimal` fields in Avro 
records when using the "the serde way" (#338)
f617b8e is described below

commit f617b8e22e2d481e896280b50aa6689925909c71
Author: Ed Fawcett-Taylor <[email protected]>
AuthorDate: Sun Nov 23 11:17:40 2025 +0000

    fix: Support deserialization of `BigDecimal` fields in Avro records when 
using the "the serde way" (#338)
    
    * initial commit
    
    * Handle BigDecimal in deserializing Union schema too
    
    * Update the new test method name
    
    * Fix the build
    
    ---------
    
    Co-authored-by: Martin Grigorov <[email protected]>
    Co-authored-by: Martin Tzvetanov Grigorov <[email protected]>
---
 avro/src/bigdecimal.rs | 42 +++++++++++++++++++++++++++++++++++++++++-
 avro/src/de.rs         |  6 ++++++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/avro/src/bigdecimal.rs b/avro/src/bigdecimal.rs
index 6022f0d..9702a8c 100644
--- a/avro/src/bigdecimal.rs
+++ b/avro/src/bigdecimal.rs
@@ -71,7 +71,7 @@ pub(crate) fn deserialize_big_decimal(bytes: &Vec<u8>) -> 
AvroResult<BigDecimal>
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::{Codec, Reader, Schema, Writer, error::Error, types::Record};
+    use crate::{Codec, Reader, Schema, Writer, error::Error, from_value, 
types::Record};
     use apache_avro_test_helper::TestResult;
     use bigdecimal::{One, Zero};
     use pretty_assertions::assert_eq;
@@ -182,6 +182,46 @@ mod tests {
         Ok(())
     }
 
+    #[test]
+    fn avro_rs_338_deserialize_serde_way() -> TestResult {
+        #[derive(Clone, PartialEq, Eq, Debug, Default, serde::Deserialize, 
serde::Serialize)]
+        struct Test {
+            big_decimal: BigDecimal,
+        }
+
+        let schema_str = r#"
+        {
+          "type": "record",
+          "name": "test",
+          "fields": [
+            {
+              "name": "big_decimal",
+              "type": "bytes",
+              "logicalType": "big-decimal"
+            }
+          ]
+        }
+        "#;
+        let schema = Schema::parse_str(schema_str)?;
+
+        let test = Test::default();
+
+        // write a record
+        let mut writer = Writer::new(&schema, Vec::new())?;
+        writer.append_ser(test.clone())?;
+
+        let wrote_data = writer.into_inner()?;
+
+        // read record
+        let mut reader = Reader::new(&wrote_data[..])?;
+
+        let value = reader.next().unwrap()?;
+
+        assert_eq!(test, from_value::<Test>(&value)?);
+
+        Ok(())
+    }
+
     #[test]
     fn test_avro_3779_from_java_file() -> TestResult {
         // Open file generated with Java code to ensure compatibility
diff --git a/avro/src/de.rs b/avro/src/de.rs
index 551b434..c2007b5 100644
--- a/avro/src/de.rs
+++ b/avro/src/de.rs
@@ -351,6 +351,9 @@ impl<'de> de::Deserializer<'de> for &Deserializer<'de> {
                 Value::Bytes(ref bytes) | Value::Fixed(_, ref bytes) => 
visitor.visit_bytes(bytes),
                 Value::Decimal(ref d) => visitor.visit_bytes(&d.to_vec()?),
                 Value::Enum(_, ref s) => visitor.visit_borrowed_str(s),
+                Value::BigDecimal(ref big_decimal) => {
+                    visitor.visit_str(big_decimal.to_plain_string().as_str())
+                }
                 _ => Err(de::Error::custom(format!(
                     "unsupported union: {:?}",
                     self.input
@@ -364,6 +367,9 @@ impl<'de> de::Deserializer<'de> for &Deserializer<'de> {
             Value::Bytes(bytes) | Value::Fixed(_, bytes) => 
visitor.visit_bytes(bytes),
             Value::Decimal(d) => visitor.visit_bytes(&d.to_vec()?),
             Value::Enum(_, s) => visitor.visit_borrowed_str(s),
+            Value::BigDecimal(big_decimal) => {
+                visitor.visit_str(big_decimal.to_plain_string().as_str())
+            }
             value => Err(de::Error::custom(format!(
                 "incorrect value of type: {:?}",
                 crate::schema::SchemaKind::from(value)

Reply via email to