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 066bd92  fix: Reduce the size of Error from 256 bytes to 88 bytes 
(#194)
066bd92 is described below

commit 066bd9213c465094d11b979adf4f1684a7ff647b
Author: Kriskras99 <[email protected]>
AuthorDate: Thu May 15 07:41:52 2025 +0200

    fix: Reduce the size of Error from 256 bytes to 88 bytes (#194)
    
    Enums are the size of their largest variants and Schema is a very
    large type. This also means that every AvroResult is also at least
    as big as the Error type.
    
    By Boxing the Schema, the size is reduced from `size_of::<Schema>() == 176`
    to `size_of::<Box<Schema>>() == 8`.
---
 avro/src/error.rs      |  6 +++---
 avro/src/ser_schema.rs | 50 +++++++++++++++++++++++++-------------------------
 avro/src/writer.rs     |  4 ++--
 3 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/avro/src/error.rs b/avro/src/error.rs
index 760f97d..36b6883 100644
--- a/avro/src/error.rs
+++ b/avro/src/error.rs
@@ -58,7 +58,7 @@ pub enum Error {
     #[error("Value {value:?} does not match schema {schema:?}: Reason: 
{reason}")]
     ValidationWithReason {
         value: Value,
-        schema: Schema,
+        schema: Box<Schema>,
         reason: String,
     },
 
@@ -449,13 +449,13 @@ pub enum Error {
     SerializeValueWithSchema {
         value_type: &'static str,
         value: String,
-        schema: Schema,
+        schema: Box<Schema>,
     },
 
     #[error("Failed to serialize field '{field_name}' for record 
{record_schema:?}: {error}")]
     SerializeRecordFieldWithSchema {
         field_name: &'static str,
-        record_schema: Schema,
+        record_schema: Box<Schema>,
         error: Box<Error>,
     },
 
diff --git a/avro/src/ser_schema.rs b/avro/src/ser_schema.rs
index 46642bc..53155a1 100644
--- a/avro/src/ser_schema.rs
+++ b/avro/src/ser_schema.rs
@@ -341,7 +341,7 @@ impl<W: Write> ser::SerializeStruct for 
SchemaAwareWriteSerializeStruct<'_, '_,
             self.serialize_next_field(&value).map_err(|e| {
                 Error::SerializeRecordFieldWithSchema {
                     field_name: key,
-                    record_schema: Schema::Record(self.record_schema.clone()),
+                    record_schema: 
Box::new(Schema::Record(self.record_schema.clone())),
                     error: Box::new(e),
                 }
             })?;
@@ -368,7 +368,7 @@ impl<W: Write> ser::SerializeStruct for 
SchemaAwareWriteSerializeStruct<'_, '_,
                         value.serialize(&mut value_ser).map_err(|e| {
                             Error::SerializeRecordFieldWithSchema {
                                 field_name: key,
-                                record_schema: 
Schema::Record(self.record_schema.clone()),
+                                record_schema: 
Box::new(Schema::Record(self.record_schema.clone())),
                                 error: Box::new(e),
                             }
                         })?;
@@ -529,7 +529,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "bool",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -560,7 +560,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "int (i8 | i16 | i32)",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -605,7 +605,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "i64",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -655,7 +655,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "u8",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -702,7 +702,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "unsigned int (u16 | u32)",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -751,7 +751,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "u64",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -805,7 +805,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "f32",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -840,7 +840,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "f64",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -875,7 +875,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "char",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -902,7 +902,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "string",
             value: format!("{value}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -970,7 +970,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
             Error::SerializeValueWithSchema {
                 value_type: "bytes",
                 value: format!("{v_str}. Cause: {cause}"),
-                schema: schema.clone(),
+                schema: Box::new(schema.clone()),
             }
         };
 
@@ -1044,7 +1044,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "none",
             value: format!("None. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1074,7 +1074,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "some",
             value: format!("Some(?). Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1111,7 +1111,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "unit struct",
             value: format!("{name}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1161,7 +1161,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "unit variant",
             value: format!("{name}::{variant} (index={variant_index}). Cause: 
{cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1235,7 +1235,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "newtype variant",
             value: format!("{name}::{variant}(?) (index={variant_index}). 
Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1271,7 +1271,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
             Error::SerializeValueWithSchema {
                 value_type: "sequence",
                 value: format!("sequence (len={len_str}). Cause: {cause}"),
-                schema: schema.clone(),
+                schema: Box::new(schema.clone()),
             }
         };
 
@@ -1307,7 +1307,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "tuple",
             value: format!("tuple (len={len}). Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1346,7 +1346,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
                 "{name}({}). Cause: {cause}",
                 vec!["?"; len].as_slice().join(",")
             ),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1408,7 +1408,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
                 "{name}::{variant}({}) (index={variant_index}). Cause: 
{cause}",
                 vec!["?"; len].as_slice().join(",")
             ),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1444,7 +1444,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
             Error::SerializeValueWithSchema {
                 value_type: "map",
                 value: format!("map (size={len_str}). Cause: {cause}"),
-                schema: schema.clone(),
+                schema: Box::new(schema.clone()),
             }
         };
 
@@ -1483,7 +1483,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "struct",
             value: format!("{name}{{ ... }}. Cause: {cause}"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
@@ -1533,7 +1533,7 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
         let create_error = |cause: String| Error::SerializeValueWithSchema {
             value_type: "struct variant",
             value: format!("{name}::{variant}{{ ... }} (size={len}. Cause: 
{cause})"),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
         };
 
         match schema {
diff --git a/avro/src/writer.rs b/avro/src/writer.rs
index c7d3141..0c8b1a1 100644
--- a/avro/src/writer.rs
+++ b/avro/src/writer.rs
@@ -604,7 +604,7 @@ fn write_value_ref_resolved(
     match value.validate_internal(schema, resolved_schema.get_names(), 
&schema.namespace()) {
         Some(reason) => Err(Error::ValidationWithReason {
             value: value.clone(),
-            schema: schema.clone(),
+            schema: Box::new(schema.clone()),
             reason,
         }),
         None => encode_internal(
@@ -630,7 +630,7 @@ fn write_value_ref_owned_resolved(
     ) {
         return Err(Error::ValidationWithReason {
             value: value.clone(),
-            schema: root_schema.clone(),
+            schema: Box::new(root_schema.clone()),
             reason,
         });
     }

Reply via email to