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

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


The following commit(s) were added to refs/heads/feat/full_enum_support by this 
push:
     new c91fa4c  wip
c91fa4c is described below

commit c91fa4c236d33c346f6578beb4464a74b3b13aa2
Author: default <[email protected]>
AuthorDate: Thu Mar 19 15:38:08 2026 +0000

    wip
---
 avro/src/bigdecimal.rs                          | 25 ++++---
 avro/src/duration.rs                            |  2 +
 avro/src/lib.rs                                 |  1 +
 avro/src/serde/de.rs                            |  2 +
 avro/src/serde/deser_schema/mod.rs              |  2 +-
 avro/src/serde/mod.rs                           |  2 +
 avro/src/serde/ser.rs                           |  2 +
 avro/src/serde/ser_schema/mod.rs                | 27 +++++++-
 avro/src/serde/ser_schema/record/mod.rs         | 89 +++++++++++++++++++------
 avro/src/serde/with.rs                          |  4 ++
 avro/src/types.rs                               |  4 ++
 avro/tests/avro-rs-226.rs                       | 22 +++---
 avro/tests/avro-rs-285-bytes_deserialization.rs | 17 ++---
 avro/tests/schema.rs                            | 13 ++--
 avro/tests/union_schema.rs                      | 81 ++++++++++------------
 15 files changed, 182 insertions(+), 111 deletions(-)

diff --git a/avro/src/bigdecimal.rs b/avro/src/bigdecimal.rs
index ee26ee1..28eeb51 100644
--- a/avro/src/bigdecimal.rs
+++ b/avro/src/bigdecimal.rs
@@ -70,13 +70,16 @@ pub(crate) fn deserialize_big_decimal(mut bytes: &[u8]) -> 
AvroResult<BigDecimal
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::{Codec, Reader, Schema, Writer, error::Error, from_value, 
types::Record};
+    use crate::{
+        Codec, Reader, Schema, Writer, error::Error, 
reader::datum::GenericDatumReader,
+        types::Record, writer::datum::GenericDatumWriter,
+    };
     use apache_avro_test_helper::TestResult;
     use bigdecimal::{One, Zero};
     use pretty_assertions::assert_eq;
     use std::{
         fs::File,
-        io::BufReader,
+        io::{BufReader, Cursor},
         ops::{Div, Mul},
         str::FromStr,
     };
@@ -206,18 +209,14 @@ mod tests {
 
         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()?;
+        let serialized = GenericDatumWriter::builder(&schema)
+            .build()?
+            .write_ser_to_vec(&test)?;
+        let value: Test = GenericDatumReader::builder(&schema)
+            .build()?
+            .read_deser(&mut Cursor::new(serialized))?;
 
-        assert_eq!(test, from_value::<Test>(&value)?);
+        assert_eq!(value, test);
 
         Ok(())
     }
diff --git a/avro/src/duration.rs b/avro/src/duration.rs
index eecfca1..41a2e43 100644
--- a/avro/src/duration.rs
+++ b/avro/src/duration.rs
@@ -209,6 +209,7 @@ mod tests {
     use crate::types::Value;
     use apache_avro_test_helper::TestResult;
 
+    #[expect(deprecated)]
     #[test]
     fn avro_rs_382_duration_from_value() -> TestResult {
         let val = Value::Duration(Duration::new(Months::new(7), Days::new(4), 
Millis::new(45)));
@@ -219,6 +220,7 @@ mod tests {
         Ok(())
     }
 
+    #[expect(deprecated)]
     #[test]
     fn avro_rs_382_duration_to_value() -> TestResult {
         let duration = Duration::new(Months::new(7), Days::new(4), 
Millis::new(45));
diff --git a/avro/src/lib.rs b/avro/src/lib.rs
index 314d596..0b6ca0f 100644
--- a/avro/src/lib.rs
+++ b/avro/src/lib.rs
@@ -101,6 +101,7 @@ pub use reader::{
     single_object::{GenericSingleObjectReader, SpecificSingleObjectReader},
 };
 pub use schema::Schema;
+#[expect(deprecated)]
 pub use serde::{AvroSchema, AvroSchemaComponent, from_value, to_value};
 pub use uuid::Uuid;
 #[expect(
diff --git a/avro/src/serde/de.rs b/avro/src/serde/de.rs
index 82d40d5..0fb6199 100644
--- a/avro/src/serde/de.rs
+++ b/avro/src/serde/de.rs
@@ -938,11 +938,13 @@ impl<'de> de::Deserializer<'de> for StringDeserializer {
 ///
 /// This conversion can fail if the structure of the `Value` does not match the
 /// structure expected by `D`.
+#[deprecated(since = "0.22.0")]
 pub fn from_value<'de, D: Deserialize<'de>>(value: &'de Value) -> Result<D, 
Error> {
     let de = Deserializer::new(value);
     D::deserialize(de)
 }
 
+#[expect(deprecated)]
 #[cfg(test)]
 mod tests {
     use num_bigint::BigInt;
diff --git a/avro/src/serde/deser_schema/mod.rs 
b/avro/src/serde/deser_schema/mod.rs
index f7c8dc6..1d1b4df 100644
--- a/avro/src/serde/deser_schema/mod.rs
+++ b/avro/src/serde/deser_schema/mod.rs
@@ -1570,7 +1570,7 @@ mod tests {
         assert_roundtrip(uuid, &schema, Vec::new())?;
 
         let buf = GenericDatumWriter::builder(&alt_schema)
-            // .human_readable(true)
+            .human_readable(true)
             .build()?
             .write_ser_to_vec(&uuid)?;
 
diff --git a/avro/src/serde/mod.rs b/avro/src/serde/mod.rs
index 3b1718b..8900d45 100644
--- a/avro/src/serde/mod.rs
+++ b/avro/src/serde/mod.rs
@@ -115,8 +115,10 @@ pub(crate) mod ser_schema;
 mod util;
 mod with;
 
+#[expect(deprecated)]
 pub use de::from_value;
 pub use derive::{AvroSchema, AvroSchemaComponent};
+#[expect(deprecated)]
 pub use ser::to_value;
 pub use with::{
     array, array_opt, bigdecimal, bigdecimal_opt, bytes, bytes_opt, fixed, 
fixed_opt, slice,
diff --git a/avro/src/serde/ser.rs b/avro/src/serde/ser.rs
index efd6fe8..d102ac1 100644
--- a/avro/src/serde/ser.rs
+++ b/avro/src/serde/ser.rs
@@ -482,10 +482,12 @@ impl ser::SerializeStructVariant for 
StructVariantSerializer {
 /// attribute. Please use [`Writer::append_ser`] if that's the case.
 ///
 /// [`Writer::append_ser`]: crate::Writer::append_ser
+#[deprecated(since = "0.22.0")]
 pub fn to_value<S: Serialize>(value: S) -> Result<Value, Error> {
     value.serialize(Serializer)
 }
 
+#[expect(deprecated)]
 #[cfg(test)]
 mod tests {
     use super::*;
diff --git a/avro/src/serde/ser_schema/mod.rs b/avro/src/serde/ser_schema/mod.rs
index c971bff..2ba62a6 100644
--- a/avro/src/serde/ser_schema/mod.rs
+++ b/avro/src/serde/ser_schema/mod.rs
@@ -1928,6 +1928,9 @@ mod tests {
         struct Foo {
             a: String,
             b: String,
+            c: i64,
+            d: f64,
+            e: i64,
         }
         let schema = Schema::parse_str(
             r#"
@@ -1942,6 +1945,18 @@ mod tests {
                 {
                     "name":"a",
                     "type":"string"
+                },
+                {
+                    "name":"d",
+                    "type":"double"
+                },
+                {
+                    "name":"e",
+                    "type":"long"
+                },
+                {
+                    "name":"c",
+                    "type":"long"
                 }
             ]
         }
@@ -1952,13 +1967,19 @@ mod tests {
         let foo = Foo {
             a: "Hello".into(),
             b: "World".into(),
+            c: 42,
+            d: std::f64::consts::PI,
+            e: 5,
         };
-        // Serializing fields out of order is NOT supported
-        assert_serialize_err(
+
+        assert_serialize(
             foo,
             &schema,
             &names,
-            r#"Missing default for skipped field 'b' of schema RecordSchema { 
name: Name { name: "Foo", .. }, fields: [RecordField { name: "b", schema: 
String, .. }, RecordField { name: "a", schema: String, .. }], .. }"#,
+            &[
+                10, b'W', b'o', b'r', b'l', b'd', 10, b'H', b'e', b'l', b'l', 
b'o', 24, 45, 68, 84,
+                251, 33, 9, 64, 10, 84,
+            ],
         );
 
         Ok(())
diff --git a/avro/src/serde/ser_schema/record/mod.rs 
b/avro/src/serde/ser_schema/record/mod.rs
index 0d44828..ac31391 100644
--- a/avro/src/serde/ser_schema/record/mod.rs
+++ b/avro/src/serde/ser_schema/record/mod.rs
@@ -26,12 +26,18 @@ use crate::{Error, Schema};
 use serde::Serialize;
 use serde::ser::{SerializeMap, SerializeStruct, SerializeStructVariant};
 use std::borrow::Borrow;
+use std::cmp::Ordering;
+use std::collections::HashMap;
 use std::io::Write;
 
 pub struct RecordSerializer<'s, 'w, W: Write, S: Borrow<Schema>> {
     writer: &'w mut W,
     record: &'s RecordSchema,
     config: Config<'s, S>,
+    /// Cache fields received out-of-order
+    cache: HashMap<usize, Vec<u8>>,
+    /// The position of the current map entry being written
+    map_position: Option<usize>,
     /// The field that should be written now.
     field_position: usize,
     bytes_written: usize,
@@ -48,6 +54,8 @@ impl<'s, 'w, W: Write, S: Borrow<Schema>> 
RecordSerializer<'s, 'w, W, S> {
             writer,
             record,
             config,
+            cache: HashMap::new(),
+            map_position: None,
             field_position: 0,
             bytes_written: bytes_written.unwrap_or(0),
         }
@@ -89,21 +97,49 @@ impl<'s, 'w, W: Write, S: Borrow<Schema>> 
RecordSerializer<'s, 'w, W, S> {
         position: usize,
         value: &T,
     ) -> Result<(), Error> {
-        // Serialize any skipped fields using their default value
-        while self.field_position < position {
-            self.serialize_default(self.field_position)?;
-        }
         let field = &self.record.fields[position];
-        self.bytes_written += value
-            .serialize(SchemaAwareSerializer::new(
-                self.writer,
-                &field.schema,
-                self.config,
-            )?)
-            .map_err(|e| self.field_error(self.field_position, e))?;
-        self.field_position += 1;
-
-        Ok(())
+        match self.field_position.cmp(&position) {
+            Ordering::Equal => {
+                // Field received in the right order
+                self.bytes_written += value
+                    .serialize(SchemaAwareSerializer::new(
+                        self.writer,
+                        &field.schema,
+                        self.config,
+                    )?)
+                    .map_err(|e| self.field_error(self.field_position, e))?;
+                self.field_position += 1;
+
+                // Write any fields that were already received and can now be 
written
+                while let Some(bytes) = 
self.cache.remove(&self.field_position) {
+                    
self.writer.write_all(&bytes).map_err(Details::WriteBytes)?;
+                    self.bytes_written += bytes.len();
+                    self.field_position += 1;
+                }
+
+                Ok(())
+            }
+            Ordering::Less => {
+                // Another field needs to be written first, so cache this field
+                let mut bytes = Vec::new();
+                value
+                    .serialize(SchemaAwareSerializer::new(
+                        &mut bytes,
+                        &field.schema,
+                        self.config,
+                    )?)
+                    .map_err(|e| self.field_error(self.field_position, e))?;
+                if self.cache.insert(position, bytes).is_some() {
+                    Err(Details::FieldNameDuplicate(field.name.clone()).into())
+                } else {
+                    Ok(())
+                }
+            }
+            Ordering::Greater => {
+                // This field is already written to the writer so we got a 
duplicate
+                Err(Details::FieldNameDuplicate(field.name.clone()).into())
+            }
+        }
     }
 
     fn serialize_default(&mut self, position: usize) -> Result<(), Error> {
@@ -171,10 +207,7 @@ impl<'s, 'w, W: Write, S: Borrow<Schema>> SerializeMap for 
RecordSerializer<'s,
     {
         let name = key.serialize(StringSerializer)?;
         if let Some(position) = self.record.lookup.get(&name).copied() {
-            // Write any skipped fields now, so that `serialize_value` can 
just call `serialize_next_field`
-            while self.field_position < position {
-                self.serialize_default(self.field_position)?;
-            }
+            self.map_position = Some(position);
             Ok(())
         } else {
             Err(Details::FieldName(name.to_string()).into())
@@ -185,13 +218,29 @@ impl<'s, 'w, W: Write, S: Borrow<Schema>> SerializeMap 
for RecordSerializer<'s,
     where
         T: ?Sized + Serialize,
     {
-        // `serialize_key` made sure that all skipped fields have been written
-        self.serialize_next_field(self.field_position, value)
+        self.serialize_next_field(
+            self.map_position
+                .expect("serialze_value called without calling serialize_key"),
+            value,
+        )
     }
 
     fn end(self) -> Result<Self::Ok, Self::Error> {
         self.end()
     }
+
+    fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), 
Self::Error>
+    where
+        K: ?Sized + Serialize,
+        V: ?Sized + Serialize,
+    {
+        let name = key.serialize(StringSerializer)?;
+        if let Some(position) = self.record.lookup.get(&name).copied() {
+            self.serialize_next_field(position, value)
+        } else {
+            Err(Details::FieldName(name.to_string()).into())
+        }
+    }
 }
 
 impl<'s, 'w, W: Write, S: Borrow<Schema>> SerializeStructVariant
diff --git a/avro/src/serde/with.rs b/avro/src/serde/with.rs
index 74c0a3a..1d0074e 100644
--- a/avro/src/serde/with.rs
+++ b/avro/src/serde/with.rs
@@ -814,9 +814,11 @@ pub mod array_opt {
 
 #[cfg(test)]
 mod tests {
+    #[expect(deprecated)]
     use crate::{Schema, from_value, to_value, types::Value};
     use serde::{Deserialize, Serialize};
 
+    #[expect(deprecated)]
     #[test]
     fn avro_3631_validate_schema_for_struct_with_byte_types() {
         #[derive(Debug, Serialize)]
@@ -884,6 +886,7 @@ mod tests {
         assert!(value.validate(&schema));
     }
 
+    #[expect(deprecated)]
     #[test]
     fn avro_3631_deserialize_value_to_struct_with_byte_types() {
         #[derive(Debug, Deserialize, PartialEq)]
@@ -1010,6 +1013,7 @@ mod tests {
         assert_eq!(expected, from_value(&value).unwrap());
     }
 
+    #[expect(deprecated)]
     #[test]
     fn avro_3631_serialize_struct_to_value_with_byte_types() {
         #[derive(Debug, Serialize)]
diff --git a/avro/src/types.rs b/avro/src/types.rs
index b6f658c..2af67c9 100644
--- a/avro/src/types.rs
+++ b/avro/src/types.rs
@@ -1228,6 +1228,7 @@ impl Value {
 
 #[cfg(test)]
 mod tests {
+    #[expect(deprecated)]
     use super::*;
     use crate::{
         duration::{Days, Millis, Months},
@@ -2788,6 +2789,7 @@ Field with name '"b"' is not a member of the map items"#,
         Ok(())
     }
 
+    #[expect(deprecated)]
     #[test]
     fn test_avro_3460_validation_with_refs_real_struct() -> TestResult {
         use serde::Serialize;
@@ -2874,6 +2876,7 @@ Field with name '"b"' is not a member of the map items"#,
         Ok(())
     }
 
+    #[expect(deprecated)]
     fn avro_3674_with_or_without_namespace(with_namespace: bool) -> TestResult 
{
         use serde::Serialize;
 
@@ -2965,6 +2968,7 @@ Field with name '"b"' is not a member of the map items"#,
         avro_3674_with_or_without_namespace(true)
     }
 
+    #[expect(deprecated)]
     fn avro_3688_schema_resolution_panic(set_field_b: bool) -> TestResult {
         use serde::{Deserialize, Serialize};
 
diff --git a/avro/tests/avro-rs-226.rs b/avro/tests/avro-rs-226.rs
index fd1b6d2..45d6f1e 100644
--- a/avro/tests/avro-rs-226.rs
+++ b/avro/tests/avro-rs-226.rs
@@ -15,7 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use apache_avro::{AvroSchema, Schema, Writer, from_value};
+use apache_avro::{
+    AvroSchema, Schema, reader::datum::GenericDatumReader, 
writer::datum::GenericDatumWriter,
+};
 use apache_avro_test_helper::TestResult;
 use serde::{Deserialize, Serialize, de::DeserializeOwned};
 use std::fmt::Debug;
@@ -24,17 +26,13 @@ fn ser_deser<T>(schema: &Schema, record: T) -> TestResult
 where
     T: Serialize + DeserializeOwned + Debug + PartialEq + Clone,
 {
-    let record2 = record.clone();
-    let mut writer = Writer::new(schema, vec![])?;
-    writer.append_ser(record)?;
-    let bytes_written = writer.into_inner()?;
-
-    let reader = apache_avro::Reader::new(&bytes_written[..])?;
-    for value in reader {
-        let value = value?;
-        let deserialized = from_value::<T>(&value)?;
-        assert_eq!(deserialized, record2);
-    }
+    let serialized = GenericDatumWriter::builder(schema)
+        .build()?
+        .write_ser_to_vec(&record)?;
+    let deserialized: T = GenericDatumReader::builder(schema)
+        .build()?
+        .read_deser(&mut &serialized[..])?;
+    assert_eq!(deserialized, record);
 
     Ok(())
 }
diff --git a/avro/tests/avro-rs-285-bytes_deserialization.rs 
b/avro/tests/avro-rs-285-bytes_deserialization.rs
index b9ebe80..5dd5e4e 100644
--- a/avro/tests/avro-rs-285-bytes_deserialization.rs
+++ b/avro/tests/avro-rs-285-bytes_deserialization.rs
@@ -15,10 +15,12 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use apache_avro::Reader;
 use apache_avro_test_helper::TestResult;
 use serde::{Deserialize, Serialize};
 
 #[derive(Debug, Deserialize, PartialEq, Serialize)]
+#[serde(rename = "SimpleRecord")]
 struct ExampleByteArray {
     #[serde(with = "apache_avro::serde::bytes_opt")]
     data_bytes: Option<Vec<u8>>,
@@ -26,6 +28,7 @@ struct ExampleByteArray {
 }
 
 #[derive(Deserialize, Serialize)]
+#[serde(rename = "SimpleRecord")]
 struct ExampleByteArrayFiltered {
     description: Option<String>,
 }
@@ -70,10 +73,9 @@ fn avro_rs_285_bytes_deserialization_round_trip() -> 
TestResult {
     let avro_data = writer.into_inner()?;
 
     // deserialize Avro binary data back into ExampleByteArray structs
-    let reader = apache_avro::Reader::new(&avro_data[..])?;
-    let deserialized_records: Vec<ExampleByteArray> = reader
-        .map(|value| 
apache_avro::from_value::<ExampleByteArray>(&value.unwrap()).unwrap())
-        .collect();
+    let deserialized_records = Reader::new(&avro_data[..])?
+        .into_deser_iter()
+        .collect::<Result<Vec<ExampleByteArray>, _>>()?;
 
     assert_eq!(records, deserialized_records);
     Ok(())
@@ -118,10 +120,9 @@ fn avro_rs_285_bytes_deserialization_filtered_round_trip() 
-> TestResult {
     let avro_data = writer.into_inner()?;
 
     // deserialize Avro binary data back into ExampleByteArrayFiltered structs
-    let reader = apache_avro::Reader::new(&avro_data[..])?;
-    let deserialized_records: Vec<ExampleByteArrayFiltered> = reader
-        .map(|value| 
apache_avro::from_value::<ExampleByteArrayFiltered>(&value.unwrap()).unwrap())
-        .collect();
+    let deserialized_records = Reader::new(&avro_data[..])?
+        .into_deser_iter()
+        .collect::<Result<Vec<ExampleByteArrayFiltered>, _>>()?;
 
     assert_eq!(records.len(), deserialized_records.len());
 
diff --git a/avro/tests/schema.rs b/avro/tests/schema.rs
index 89e328a..0c322aa 100644
--- a/avro/tests/schema.rs
+++ b/avro/tests/schema.rs
@@ -15,14 +15,13 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use apache_avro::to_value;
 use apache_avro::writer::datum::GenericDatumWriter;
 use apache_avro::{
     Codec, Error, Reader, Schema, Writer,
     error::Details,
-    from_value,
     reader::datum::GenericDatumReader,
     schema::{EnumSchema, FixedSchema, Name, RecordField, RecordSchema},
-    to_value,
     types::{Record, Value},
 };
 use apache_avro_test_helper::{
@@ -837,7 +836,7 @@ fn avro_old_issue_47() -> TestResult {
     let schema_str = r#"
     {
       "type": "record",
-      "name": "my_record",
+      "name": "MyRecord",
       "fields": [
         {"name": "a", "type": "long"},
         {"name": "b", "type": "string"}
@@ -858,15 +857,13 @@ fn avro_old_issue_47() -> TestResult {
         a: 1,
     };
 
-    let ser_value = to_value(record.clone())?;
     let serialized_bytes = GenericDatumWriter::builder(&schema)
         .build()?
-        .write_value_to_vec(ser_value)?;
+        .write_ser_to_vec(&record)?;
 
-    let de_value = GenericDatumReader::builder(&schema)
+    let deserialized_record: MyRecord = GenericDatumReader::builder(&schema)
         .build()?
-        .read_value(&mut &*serialized_bytes)?;
-    let deserialized_record = from_value::<MyRecord>(&de_value)?;
+        .read_deser(&mut &*serialized_bytes)?;
 
     assert_eq!(record, deserialized_record);
     Ok(())
diff --git a/avro/tests/union_schema.rs b/avro/tests/union_schema.rs
index 892b69b..04a9709 100644
--- a/avro/tests/union_schema.rs
+++ b/avro/tests/union_schema.rs
@@ -15,8 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use apache_avro::{AvroResult, Codec, Reader, Schema, Writer, from_value};
+use apache_avro::{Schema, reader::datum::GenericDatumReader, 
writer::datum::GenericDatumWriter};
+use apache_avro_test_helper::TestResult;
+use pretty_assertions::assert_eq;
 use serde::{Deserialize, Serialize, de::DeserializeOwned};
+use std::fmt::Debug;
 
 static SCHEMA_A_STR: &str = r#"{
         "name": "A",
@@ -65,26 +68,25 @@ struct C {
     field_c: String,
 }
 
-fn encode_decode<T>(input: &T, schema: &Schema, schemata: &[Schema]) -> 
AvroResult<T>
+#[track_caller]
+fn assert_roundtrip<T>(input: &T, schema: &Schema, schemata: &[Schema]) -> 
TestResult
 where
-    T: DeserializeOwned + Serialize,
+    T: DeserializeOwned + Serialize + PartialEq + Debug,
 {
-    let mut encoded: Vec<u8> = Vec::new();
-    let mut writer =
-        Writer::with_schemata(schema, schemata.iter().collect(), &mut encoded, 
Codec::Null)?;
-    writer.append_ser(input)?;
-    writer.flush()?;
-    drop(writer); //drop the writer so that `encoded` is no more referenced 
mutably
-
-    let mut reader = Reader::builder(encoded.as_slice())
-        .reader_schema(schema)
-        .schemata(schemata.iter().collect())
-        .build()?;
-    from_value::<T>(&reader.next().expect("")?)
+    let serialized = GenericDatumWriter::builder(schema)
+        .schemata(schemata.iter().collect())?
+        .build()?
+        .write_ser_to_vec(input)?;
+    let deserialized: T = GenericDatumReader::builder(schema)
+        .writer_schemata(schemata.iter().collect())?
+        .build()?
+        .read_deser(&mut &serialized[..])?;
+    assert_eq!(&deserialized, input);
+    Ok(())
 }
 
 #[test]
-fn test_avro_3901_union_schema_round_trip_no_null() -> AvroResult<()> {
+fn test_avro_3901_union_schema_round_trip_no_null() -> TestResult {
     let schemata: Vec<Schema> =
         Schema::parse_list([SCHEMA_A_STR, SCHEMA_B_STR, 
SCHEMA_C_STR]).expect("parsing schemata");
 
@@ -92,15 +94,13 @@ fn test_avro_3901_union_schema_round_trip_no_null() -> 
AvroResult<()> {
         field_union: (UnionAB::A(A { field_a: 45.5 })),
         field_c: "foo".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = C {
         field_union: (UnionAB::B(B { field_b: 73 })),
         field_c: "bar".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     Ok(())
 }
@@ -128,7 +128,7 @@ struct D {
 }
 
 #[test]
-fn test_avro_3901_union_schema_round_trip_null_at_start() -> AvroResult<()> {
+fn test_avro_3901_union_schema_round_trip_null_at_start() -> TestResult {
     let schemata: Vec<Schema> =
         Schema::parse_list([SCHEMA_A_STR, SCHEMA_B_STR, 
SCHEMA_D_STR]).expect("parsing schemata");
 
@@ -136,22 +136,19 @@ fn test_avro_3901_union_schema_round_trip_null_at_start() 
-> AvroResult<()> {
         field_union: UnionNoneAB::A(A { field_a: 54.25 }),
         field_d: "fooy".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = D {
         field_union: UnionNoneAB::None,
         field_d: "fooyy".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = D {
         field_union: UnionNoneAB::B(B { field_b: 103 }),
         field_d: "foov".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     Ok(())
 }
@@ -179,7 +176,7 @@ struct E {
 }
 
 #[test]
-fn test_avro_3901_union_schema_round_trip_with_out_of_order_null() -> 
AvroResult<()> {
+fn test_avro_3901_union_schema_round_trip_with_out_of_order_null() -> 
TestResult {
     let schemata: Vec<Schema> =
         Schema::parse_list([SCHEMA_A_STR, SCHEMA_B_STR, 
SCHEMA_E_STR]).expect("parsing schemata");
 
@@ -187,22 +184,19 @@ fn 
test_avro_3901_union_schema_round_trip_with_out_of_order_null() -> AvroResult
         field_union: UnionANoneB::A(A { field_a: 23.75 }),
         field_e: "barme".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = E {
         field_union: UnionANoneB::None,
         field_e: "barme2".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = E {
         field_union: UnionANoneB::B(B { field_b: 89 }),
         field_e: "barme3".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     Ok(())
 }
@@ -230,7 +224,7 @@ struct F {
 }
 
 #[test]
-fn test_avro_3901_union_schema_round_trip_with_end_null() -> AvroResult<()> {
+fn test_avro_3901_union_schema_round_trip_with_end_null() -> TestResult {
     let schemata: Vec<Schema> =
         Schema::parse_list([SCHEMA_A_STR, SCHEMA_B_STR, 
SCHEMA_F_STR]).expect("parsing schemata");
 
@@ -238,22 +232,19 @@ fn test_avro_3901_union_schema_round_trip_with_end_null() 
-> AvroResult<()> {
         field_union: UnionABNone::A(A { field_a: 23.75 }),
         field_f: "aoe".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = F {
         field_union: UnionABNone::B(B { field_b: 89 }),
         field_f: "aoe3".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     let input = F {
         field_union: UnionABNone::None,
         field_f: "aoee2".to_string(),
     };
-    let output = encode_decode(&input, &schemata[2], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[2], &schemata)?;
 
     Ok(())
 }
@@ -321,22 +312,20 @@ struct H {
 }
 
 #[test]
-fn test_avro_3901_union_schema_as_optional() -> AvroResult<()> {
+fn test_avro_3901_union_schema_as_optional() -> TestResult {
     let schemata: Vec<Schema> = 
Schema::parse_list([SCHEMA_H_STR]).expect("parsing schemata");
 
     let input = H {
         field_union: Some(23),
         field_h: "aaa".to_string(),
     };
-    let output = encode_decode(&input, &schemata[0], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[0], &schemata)?;
 
     let input = H {
         field_union: None,
         field_h: "bbb".to_string(),
     };
-    let output = encode_decode(&input, &schemata[0], &schemata)?;
-    assert_eq!(input, output);
+    assert_roundtrip(&input, &schemata[0], &schemata)?;
 
     Ok(())
 }

Reply via email to