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 d7f2ead fix!: Small things (#486)
d7f2ead is described below
commit d7f2eade55d4d7ad8d945df10c56c6131415eb49
Author: Kriskras99 <[email protected]>
AuthorDate: Thu Feb 26 09:28:12 2026 +0100
fix!: Small things (#486)
* fix: `deserialize_big_decimal` doesn't need a `Vec<u8>`
* fix!: `Alias::name` and `Alias::namespace` should return references, user
can clone if needed
* fix: Implement `AvroSchemaComponent` for `()`
* fix: Change default of `SER_BYTES_TYPE` to `BytesType::Unset`
This is not used yet, but will be used for improving
`SchemaAwareWriteSerializer`.
* chore: Change the `ser_schema` module from file to directory
* fix: Use `Write::write_all` in `utils::encode_variable`
* fix: Use `#[track_caller]` for `assert{,_not}_logged` to show the caller
source location when panicking
* chore: Correct test number
---
avro/src/bigdecimal.rs | 3 +--
avro/src/schema/name.rs | 8 ++++----
avro/src/serde/derive.rs | 9 +++++++++
avro/src/serde/ser.rs | 2 +-
avro/src/serde/{ser_schema.rs => ser_schema/mod.rs} | 0
avro/src/serde/with.rs | 17 ++++++++++++++++-
avro/src/util.rs | 5 +++--
avro_test_helper/src/logger.rs | 2 ++
8 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/avro/src/bigdecimal.rs b/avro/src/bigdecimal.rs
index b887535..7a6a379 100644
--- a/avro/src/bigdecimal.rs
+++ b/avro/src/bigdecimal.rs
@@ -47,8 +47,7 @@ pub(crate) fn serialize_big_decimal(decimal: &BigDecimal) ->
AvroResult<Vec<u8>>
Ok(final_buffer)
}
-pub(crate) fn deserialize_big_decimal(bytes: &Vec<u8>) ->
AvroResult<BigDecimal> {
- let mut bytes: &[u8] = bytes.as_slice();
+pub(crate) fn deserialize_big_decimal(mut bytes: &[u8]) ->
AvroResult<BigDecimal> {
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()),
diff --git a/avro/src/schema/name.rs b/avro/src/schema/name.rs
index e572d8b..b551584 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 {
diff --git a/avro/src/serde/derive.rs b/avro/src/serde/derive.rs
index f384fb3..7e3fb9e 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_486_unit() -> TestResult {
+ let schema = <()>::get_schema();
+ assert_eq!(schema, Schema::Null);
+
+ Ok(())
+ }
}
diff --git a/avro/src/serde/ser.rs b/avro/src/serde/ser.rs
index 76c6579..efd6fe8 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<Self::Ok, Self::Error> {
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/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
diff --git a/avro/src/serde/with.rs b/avro/src/serde/with.rs
index d5da690..9d236d1 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<BytesType> = const {
Cell::new(BytesType::Bytes) };
+ pub(crate) static SER_BYTES_TYPE: Cell<BytesType> = 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)
}
diff --git a/avro/src/util.rs b/avro/src/util.rs
index 8acbfa4..3127f8d 100644
--- a/avro/src/util.rs
+++ b/avro/src/util.rs
@@ -127,8 +127,9 @@ fn encode_variable<W: Write>(mut zigzagged: u64, mut
writer: W) -> AvroResult<us
}
}
writer
- .write(&buffer[..i])
- .map_err(|e| Details::WriteBytes(e).into())
+ .write_all(&buffer[..i])
+ .map_err(Details::WriteBytes)?;
+ Ok(i)
}
/// Read a varint from the reader.
diff --git a/avro_test_helper/src/logger.rs b/avro_test_helper/src/logger.rs
index fe83238..738cdee 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| {