From bab8998083da17ba07542cf9c9c7219a68ed9294 Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 21:28:06 +0100 Subject: [PATCH 1/8] fix: `deserialize_big_decimal` doesn't need a `Vec` --- avro/src/bigdecimal.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/avro/src/bigdecimal.rs b/avro/src/bigdecimal.rs index b8875350..7a6a3796 100644 --- a/avro/src/bigdecimal.rs +++ b/avro/src/bigdecimal.rs @@ -47,8 +47,7 @@ pub(crate) fn serialize_big_decimal(decimal: &BigDecimal) -> AvroResult> Ok(final_buffer) } -pub(crate) fn deserialize_big_decimal(bytes: &Vec) -> AvroResult { - let mut bytes: &[u8] = bytes.as_slice(); +pub(crate) fn deserialize_big_decimal(mut bytes: &[u8]) -> AvroResult { let mut big_decimal_buffer = match decode_len(&mut bytes) { Ok(size) => vec![0u8; size], Err(err) => return Err(Details::BigDecimalLen(Box::new(err)).into()), From 4e9ae8981bf5772d119fc6eeb131f369a1015594 Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 21:31:01 +0100 Subject: [PATCH 2/8] fix!: `Alias::name` and `Alias::namespace` should return references, user can clone if needed --- avro/src/schema/name.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/avro/src/schema/name.rs b/avro/src/schema/name.rs index e572d8b2..b551584c 100644 --- a/avro/src/schema/name.rs +++ b/avro/src/schema/name.rs @@ -202,12 +202,12 @@ impl Alias { Name::new(name).map(Self) } - pub fn name(&self) -> String { - self.0.name.clone() + pub fn name(&self) -> &str { + &self.0.name } - pub fn namespace(&self) -> Namespace { - self.0.namespace.clone() + pub fn namespace(&self) -> &Namespace { + &self.0.namespace } pub fn fullname(&self, default_namespace: Namespace) -> String { From 1582cad915a96f7bb6cb15820daec4b496f215f4 Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 21:34:01 +0100 Subject: [PATCH 3/8] fix: Implement `AvroSchemaComponent` for `()` --- avro/src/serde/derive.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/avro/src/serde/derive.rs b/avro/src/serde/derive.rs index f384fb3f..5fa91dea 100644 --- a/avro/src/serde/derive.rs +++ b/avro/src/serde/derive.rs @@ -544,6 +544,7 @@ impl_schema!(f64, Schema::Double); impl_schema!(String, Schema::String); impl_schema!(str, Schema::String); impl_schema!(char, Schema::String); +impl_schema!((), Schema::Null); macro_rules! impl_passthrough_schema ( ($type:ty where T: AvroSchemaComponent + ?Sized $(+ $bound:tt)*) => ( @@ -943,4 +944,12 @@ mod tests { Ok(()) } + + #[test] + fn avro_rs_xxx_unit() -> TestResult { + let schema = <()>::get_schema(); + assert_eq!(schema, Schema::Null); + + Ok(()) + } } From b7d475703d66ac9c3798ebff1e36aaac6de40e84 Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 21:41:24 +0100 Subject: [PATCH 4/8] fix: Change default of `SER_BYTES_TYPE` to `BytesType::Unset` This is not used yet, but will be used for improving `SchemaAwareWriteSerializer`. --- avro/src/serde/ser.rs | 2 +- avro/src/serde/with.rs | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/avro/src/serde/ser.rs b/avro/src/serde/ser.rs index 76c6579f..efd6fe8b 100644 --- a/avro/src/serde/ser.rs +++ b/avro/src/serde/ser.rs @@ -182,7 +182,7 @@ impl ser::Serializer for Serializer { fn serialize_bytes(self, v: &[u8]) -> Result { match SER_BYTES_TYPE.get() { - BytesType::Bytes => Ok(Value::Bytes(v.to_owned())), + BytesType::Unset | BytesType::Bytes => Ok(Value::Bytes(v.to_owned())), BytesType::Fixed => Ok(Value::Fixed(v.len(), v.to_owned())), } } diff --git a/avro/src/serde/with.rs b/avro/src/serde/with.rs index d5da6905..9d236d1f 100644 --- a/avro/src/serde/with.rs +++ b/avro/src/serde/with.rs @@ -22,7 +22,7 @@ thread_local! { /// [`Value::Bytes`] or [`Value::Fixed`]. /// /// Relies on the fact that serde's serialization process is single-threaded. - pub(crate) static SER_BYTES_TYPE: Cell = const { Cell::new(BytesType::Bytes) }; + pub(crate) static SER_BYTES_TYPE: Cell = const { Cell::new(BytesType::Unset) }; /// A thread local that is used to decide if a [`Value::Bytes`] needs to be deserialized to /// a [`Vec`] or slice. @@ -33,6 +33,7 @@ thread_local! { #[derive(Debug, Clone, Copy)] pub(crate) enum BytesType { + Unset, Bytes, Fixed, } @@ -92,6 +93,7 @@ impl Drop for BorrowedGuard { /// /// [`apache_avro::serde::bytes_opt`]: bytes_opt pub mod bytes { + use super::BytesType; use std::collections::HashSet; use serde::{Deserializer, Serializer}; @@ -119,6 +121,7 @@ pub mod bytes { where S: Serializer, { + let _guard = super::BytesTypeGuard::set(BytesType::Bytes); serde_bytes::serialize(bytes, serializer) } @@ -126,6 +129,7 @@ pub mod bytes { where D: Deserializer<'de>, { + let _guard = super::BytesTypeGuard::set(BytesType::Bytes); serde_bytes::deserialize(deserializer) } } @@ -155,6 +159,7 @@ pub mod bytes { /// /// [`apache_avro::serde::bytes`]: bytes pub mod bytes_opt { + use super::BytesType; use serde::{Deserializer, Serializer}; use std::{borrow::Borrow, collections::HashSet}; @@ -184,6 +189,7 @@ pub mod bytes_opt { S: Serializer, B: Borrow<[u8]> + serde_bytes::Serialize, { + let _guard = super::BytesTypeGuard::set(BytesType::Bytes); serde_bytes::serialize(bytes, serializer) } @@ -191,6 +197,7 @@ pub mod bytes_opt { where D: Deserializer<'de>, { + let _guard = super::BytesTypeGuard::set(BytesType::Bytes); serde_bytes::deserialize(deserializer) } } @@ -268,6 +275,7 @@ pub mod fixed { where D: Deserializer<'de>, { + let _guard = super::BytesTypeGuard::set(BytesType::Fixed); serde_bytes::deserialize(deserializer) } } @@ -342,6 +350,7 @@ pub mod fixed_opt { where D: Deserializer<'de>, { + let _guard = super::BytesTypeGuard::set(BytesType::Fixed); serde_bytes::deserialize(deserializer) } } @@ -373,6 +382,7 @@ pub mod fixed_opt { /// [`Value::Fixed`]: crate::types::Value::Fixed /// [`apache_avro::serde::slice_opt`]: slice_opt pub mod slice { + use super::BytesType; use std::collections::HashSet; use serde::{Deserializer, Serializer}; @@ -400,6 +410,7 @@ pub mod slice { where S: Serializer, { + let _guard = super::BytesTypeGuard::set(BytesType::Bytes); serde_bytes::serialize(bytes, serializer) } @@ -407,6 +418,7 @@ pub mod slice { where D: Deserializer<'de>, { + let _bytes_guard = super::BytesTypeGuard::set(BytesType::Bytes); let _guard = super::BorrowedGuard::set(true); serde_bytes::deserialize(deserializer) } @@ -439,6 +451,7 @@ pub mod slice { /// [`Value::Fixed`]: crate::types::Value::Fixed /// [`apache_avro::serde::slice`]: mod@slice pub mod slice_opt { + use super::BytesType; use serde::{Deserializer, Serializer}; use std::{borrow::Borrow, collections::HashSet}; @@ -468,6 +481,7 @@ pub mod slice_opt { S: Serializer, B: Borrow<[u8]> + serde_bytes::Serialize, { + let _guard = super::BytesTypeGuard::set(BytesType::Bytes); serde_bytes::serialize(&bytes, serializer) } @@ -475,6 +489,7 @@ pub mod slice_opt { where D: Deserializer<'de>, { + let _bytes_guard = super::BytesTypeGuard::set(BytesType::Bytes); let _guard = super::BorrowedGuard::set(true); serde_bytes::deserialize(deserializer) } From ed4bc3251943e30cc65251f6db301a1efab5196b Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 21:44:05 +0100 Subject: [PATCH 5/8] chore: Change the `ser_schema` module from file to directory --- avro/src/serde/{ser_schema.rs => ser_schema/mod.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename avro/src/serde/{ser_schema.rs => ser_schema/mod.rs} (100%) diff --git a/avro/src/serde/ser_schema.rs b/avro/src/serde/ser_schema/mod.rs similarity index 100% rename from avro/src/serde/ser_schema.rs rename to avro/src/serde/ser_schema/mod.rs From 7ce2e389d490c2181e3b1354a54bd0a4ffb0dcbd Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 21:54:57 +0100 Subject: [PATCH 6/8] fix: Use `Write::write_all` in `utils::encode_variable` --- avro/src/util.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/avro/src/util.rs b/avro/src/util.rs index 8acbfa42..3127f8d1 100644 --- a/avro/src/util.rs +++ b/avro/src/util.rs @@ -127,8 +127,9 @@ fn encode_variable(mut zigzagged: u64, mut writer: W) -> AvroResult Date: Wed, 25 Feb 2026 21:58:37 +0100 Subject: [PATCH 7/8] fix: Use `#[track_caller]` for `assert{,_not}_logged` to show the caller source location when panicking --- avro_test_helper/src/logger.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/avro_test_helper/src/logger.rs b/avro_test_helper/src/logger.rs index fe832389..738cdeed 100644 --- a/avro_test_helper/src/logger.rs +++ b/avro_test_helper/src/logger.rs @@ -60,6 +60,7 @@ pub fn clear_log_messages() { }); } +#[track_caller] pub fn assert_not_logged(unexpected_message: &str) { LOG_MESSAGES.with(|msgs| match msgs.borrow().last() { Some(last_log) if last_log == unexpected_message => { @@ -69,6 +70,7 @@ pub fn assert_not_logged(unexpected_message: &str) { }); } +#[track_caller] pub fn assert_logged(expected_message: &str) { let mut deleted = false; LOG_MESSAGES.with(|msgs| { From 055d2c8ed90c3ec9320414d42087348b65135859 Mon Sep 17 00:00:00 2001 From: Kriskras99 Date: Wed, 25 Feb 2026 22:03:01 +0100 Subject: [PATCH 8/8] chore: Correct test number --- avro/src/serde/derive.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avro/src/serde/derive.rs b/avro/src/serde/derive.rs index 5fa91dea..7e3fb9e3 100644 --- a/avro/src/serde/derive.rs +++ b/avro/src/serde/derive.rs @@ -946,7 +946,7 @@ mod tests { } #[test] - fn avro_rs_xxx_unit() -> TestResult { + fn avro_rs_486_unit() -> TestResult { let schema = <()>::get_schema(); assert_eq!(schema, Schema::Null);