You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by kr...@apache.org on 2026/01/18 21:40:57 UTC
(avro-rs) 02/05: fix: Move the `bytes` module to the `serde` module
This is an automated email from the ASF dual-hosted git repository.
kriskras99 pushed a commit to branch feat/documentation
in repository https://gitbox.apache.org/repos/asf/avro-rs.git
commit 2bcb8709b8c7d60b75049dd021df102b7166a20c
Author: Kriskras99 <gi...@kriskras99.nl>
AuthorDate: Sun Jan 18 11:30:39 2026 +0100
fix: Move the `bytes` module to the `serde` module
---
avro/src/lib.rs | 24 +---
avro/src/serde/de.rs | 3 +-
avro/src/serde/mod.rs | 7 +-
avro/src/serde/ser.rs | 7 +-
avro/src/{bytes.rs => serde/with.rs} | 174 ++++++++++++------------
avro/tests/avro-rs-285-bytes_deserialization.rs | 2 +-
avro_derive/tests/serde.rs | 21 ++-
7 files changed, 116 insertions(+), 122 deletions(-)
diff --git a/avro/src/lib.rs b/avro/src/lib.rs
index 40be7f9..2d144ea 100644
--- a/avro/src/lib.rs
+++ b/avro/src/lib.rs
@@ -868,13 +868,13 @@
//!
//! #[derive(Debug, Deserialize, Serialize)]
//! struct SampleStruct {
-//! #[serde(with = "apache_avro::serde_avro_bytes")]
+//! #[serde(with = "apache_avro::serde::bytes")]
//! non_optional_bytes: Vec<u8>,
-//! #[serde(with = "apache_avro::serde_avro_bytes_opt")]
+//! #[serde(with = "apache_avro::serde::bytes_opt")]
//! optional_bytes: Option<Vec<u8>>,
-//! #[serde(with = "apache_avro::serde_avro_fixed")]
+//! #[serde(with = "apache_avro::serde::fixed")]
//! non_optional_fixed: [u8; 6],
-//! #[serde(with = "apache_avro::serde_avro_fixed_opt")]
+//! #[serde(with = "apache_avro::serde::fixed_opt")]
//! optional_fixed: Option<[u8; 6]>,
//! }
//! ```
@@ -886,7 +886,7 @@
//!
//! #[derive(Debug, Deserialize, PartialEq, Serialize)]
//! struct ExampleByteArray {
-//! #[serde(with = "apache_avro::serde_avro_bytes_opt")]
+//! #[serde(with = "apache_avro::serde::bytes_opt")]
//! data_bytes: Option<Vec<u8>>,
//! description: Option<String>,
//! }
@@ -938,19 +938,14 @@
//! assert_eq!(records, deserialized_records);
//! }
//! ```
-//!
-//! Full implementation and other options for things like fixed byte arrays can be found in src/bytes.rs
-//!
mod bigdecimal;
-mod bytes;
mod codec;
mod decimal;
mod decode;
mod duration;
mod encode;
mod reader;
-mod serde;
mod writer;
pub mod error;
@@ -959,17 +954,12 @@ pub mod rabin;
pub mod schema;
pub mod schema_compatibility;
pub mod schema_equality;
+pub mod serde;
pub mod types;
pub mod util;
pub mod validator;
-pub use crate::{
- bigdecimal::BigDecimal,
- bytes::{
- serde_avro_bytes, serde_avro_bytes_opt, serde_avro_fixed, serde_avro_fixed_opt,
- serde_avro_slice, serde_avro_slice_opt,
- },
-};
+pub use crate::bigdecimal::BigDecimal;
#[cfg(feature = "bzip")]
pub use codec::bzip::Bzip2Settings;
#[cfg(feature = "xz")]
diff --git a/avro/src/serde/de.rs b/avro/src/serde/de.rs
index 04c0f74..57ae16d 100644
--- a/avro/src/serde/de.rs
+++ b/avro/src/serde/de.rs
@@ -16,7 +16,8 @@
// under the License.
//! Logic for serde-compatible deserialization.
-use crate::{Error, bytes::DE_BYTES_BORROWED, error::Details, types::Value};
+use crate::serde::with::DE_BYTES_BORROWED;
+use crate::{Error, error::Details, types::Value};
use serde::{
Deserialize,
de::{self, DeserializeSeed, Deserializer as _, Visitor},
diff --git a/avro/src/serde/mod.rs b/avro/src/serde/mod.rs
index efd1032..3480a14 100644
--- a/avro/src/serde/mod.rs
+++ b/avro/src/serde/mod.rs
@@ -15,7 +15,12 @@
// specific language governing permissions and limitations
// under the License.
+mod util;
+mod with;
+
pub mod de;
pub mod ser;
pub mod ser_schema;
-mod util;
+
+#[doc(inline)]
+pub use with::{bytes, bytes_opt, fixed, fixed_opt, slice, slice_opt};
diff --git a/avro/src/serde/ser.rs b/avro/src/serde/ser.rs
index 3efbd62..9023ae5 100644
--- a/avro/src/serde/ser.rs
+++ b/avro/src/serde/ser.rs
@@ -16,11 +16,8 @@
// under the License.
//! Logic for serde-compatible serialization.
-use crate::{
- Error,
- bytes::{BytesType, SER_BYTES_TYPE},
- types::Value,
-};
+use crate::serde::with::{BytesType, SER_BYTES_TYPE};
+use crate::{Error, types::Value};
use serde::{Serialize, ser};
use std::{collections::HashMap, iter::once};
diff --git a/avro/src/bytes.rs b/avro/src/serde/with.rs
similarity index 84%
rename from avro/src/bytes.rs
rename to avro/src/serde/with.rs
index 34f836e..29d43d6 100644
--- a/avro/src/bytes.rs
+++ b/avro/src/serde/with.rs
@@ -40,25 +40,27 @@ pub(crate) enum BytesType {
/// Efficient (de)serialization of Avro bytes values.
///
/// This module is intended to be used through the Serde `with` attribute. Use
-/// [`serde_avro_bytes_opt`] for optional bytes.
+/// [`apache_avro::serde::bytes_opt`] for optional bytes.
///
/// See usage with below example:
-/// ```rust
-/// use apache_avro::{AvroSchema, serde_avro_bytes, serde_avro_fixed};
-/// use serde::{Deserialize, Serialize};
+/// ```
+/// # use apache_avro::AvroSchema;
+/// # use serde::{Deserialize, Serialize};
///
/// #[derive(AvroSchema, Serialize, Deserialize)]
/// struct StructWithBytes {
/// #[avro(with)]
-/// #[serde(with = "serde_avro_bytes")]
+/// #[serde(with = "apache_avro::serde::bytes")]
/// vec_field: Vec<u8>,
///
-/// #[avro(with = serde_avro_fixed::get_schema_in_ctxt::<6>)]
-/// #[serde(with = "serde_avro_fixed")]
+/// #[avro(with = apache_avro::serde::fixed::get_schema_in_ctxt::<6>)]
+/// #[serde(with = "apache_avro::serde::fixed")]
/// fixed_field: [u8; 6],
/// }
/// ```
-pub mod serde_avro_bytes {
+///
+/// [`apache_avro::serde::bytes_opt`]: bytes_opt
+pub mod bytes {
use serde::{Deserializer, Serializer};
use crate::{
@@ -89,25 +91,27 @@ pub mod serde_avro_bytes {
/// Efficient (de)serialization of optional Avro bytes values.
///
/// This module is intended to be used through the Serde `with` attribute. Use
-/// [`serde_avro_bytes`] for non optional bytes.
+/// [`apache_avro::serde::bytes`] for non-optional bytes.
///
/// See usage with below example:
-/// ```rust
-/// use apache_avro::{AvroSchema, serde_avro_bytes_opt, serde_avro_fixed_opt};
-/// use serde::{Deserialize, Serialize};
+/// ```
+/// # use apache_avro::AvroSchema;
+/// # use serde::{Deserialize, Serialize};
///
/// #[derive(AvroSchema, Serialize, Deserialize)]
/// struct StructWithBytes {
/// #[avro(with)]
-/// #[serde(with = "serde_avro_bytes_opt")]
+/// #[serde(with = "apache_avro::serde::bytes_opt")]
/// vec_field: Option<Vec<u8>>,
///
-/// #[avro(with = serde_avro_fixed_opt::get_schema_in_ctxt::<6>)]
-/// #[serde(with = "serde_avro_fixed_opt")]
+/// #[avro(with = apache_avro::serde::fixed_opt::get_schema_in_ctxt::<6>)]
+/// #[serde(with = "apache_avro::serde::fixed_opt")]
/// fixed_field: Option<[u8; 6]>,
/// }
/// ```
-pub mod serde_avro_bytes_opt {
+///
+/// [`apache_avro::serde::bytes`]: bytes
+pub mod bytes_opt {
use serde::{Deserializer, Serializer};
use std::borrow::Borrow;
@@ -142,25 +146,27 @@ pub mod serde_avro_bytes_opt {
/// Efficient (de)serialization of Avro fixed values.
///
/// This module is intended to be used through the Serde `with` attribute. Use
-/// [`serde_avro_fixed_opt`] for optional fixed values.
+/// [`apache_avro::serde::fixed_opt`] for optional fixed values.
///
/// See usage with below example:
-/// ```rust
-/// use apache_avro::{AvroSchema, serde_avro_bytes, serde_avro_fixed};
-/// use serde::{Deserialize, Serialize};
+/// ```
+/// # use apache_avro::AvroSchema;
+/// # use serde::{Deserialize, Serialize};
///
/// #[derive(AvroSchema, Serialize, Deserialize)]
/// struct StructWithBytes {
/// #[avro(with)]
-/// #[serde(with = "serde_avro_bytes")]
+/// #[serde(with = "apache_avro::serde::bytes")]
/// vec_field: Vec<u8>,
///
-/// #[avro(with = serde_avro_fixed::get_schema_in_ctxt::<6>)]
-/// #[serde(with = "serde_avro_fixed")]
+/// #[avro(with = apache_avro::serde::fixed::get_schema_in_ctxt::<6>)]
+/// #[serde(with = "apache_avro::serde::fixed")]
/// fixed_field: [u8; 6],
/// }
/// ```
-pub mod serde_avro_fixed {
+///
+/// [`apache_avro::serde::fixed_opt`]: fixed_opt
+pub mod fixed {
use super::{BytesType, SER_BYTES_TYPE};
use serde::{Deserializer, Serializer};
@@ -208,25 +214,27 @@ pub mod serde_avro_fixed {
/// Efficient (de)serialization of optional Avro fixed values.
///
/// This module is intended to be used through the Serde `with` attribute. Use
-/// [`serde_avro_fixed`] for non optional fixed values.
+/// [`apache_avro::serde::fixed`] for non-optional fixed values.
///
/// See usage with below example:
-/// ```rust
-/// use apache_avro::{AvroSchema, serde_avro_bytes_opt, serde_avro_fixed_opt};
-/// use serde::{Deserialize, Serialize};
+/// ```
+/// # use apache_avro::AvroSchema;
+/// # use serde::{Deserialize, Serialize};
///
/// #[derive(AvroSchema, Serialize, Deserialize)]
/// struct StructWithBytes {
/// #[avro(with)]
-/// #[serde(with = "serde_avro_bytes_opt")]
+/// #[serde(with = "apache_avro::serde::bytes_opt")]
/// vec_field: Option<Vec<u8>>,
///
-/// #[avro(with = serde_avro_fixed_opt::get_schema_in_ctxt::<6>)]
-/// #[serde(with = "serde_avro_fixed_opt")]
+/// #[avro(with = apache_avro::serde::fixed_opt::get_schema_in_ctxt::<6>)]
+/// #[serde(with = "apache_avro::serde::fixed_opt")]
/// fixed_field: Option<[u8; 6]>,
/// }
/// ```
-pub mod serde_avro_fixed_opt {
+///
+/// [`apache_avro::serde::fixed`]: fixed
+pub mod fixed_opt {
use super::{BytesType, SER_BYTES_TYPE};
use serde::{Deserializer, Serializer};
use std::borrow::Borrow;
@@ -244,10 +252,7 @@ pub mod serde_avro_fixed_opt {
Schema::Union(
UnionSchema::new(vec![
Schema::Null,
- super::serde_avro_fixed::get_schema_in_ctxt::<N>(
- named_schemas,
- enclosing_namespace,
- ),
+ super::fixed::get_schema_in_ctxt::<N>(named_schemas, enclosing_namespace),
])
.expect("This is a valid union"),
)
@@ -279,24 +284,25 @@ pub mod serde_avro_fixed_opt {
/// Note that `&[u8]` are always serialized as [`Value::Bytes`]. However,
/// both [`Value::Bytes`] and [`Value::Fixed`] can be deserialized as `&[u8]`.
///
-/// Use [`serde_avro_slice_opt`] for optional bytes/fixed borrowed values.
+/// Use [`apache_avro::serde::slice`] for optional bytes/fixed borrowed values.
///
/// See usage with below example:
/// ```rust
-/// use apache_avro::{AvroSchema, serde_avro_slice};
-/// use serde::{Deserialize, Serialize};
+/// # use apache_avro::AvroSchema;
+/// # use serde::{Deserialize, Serialize};
///
/// #[derive(AvroSchema, Serialize, Deserialize)]
/// struct StructWithBytes<'a> {
/// #[avro(with)]
-/// #[serde(with = "serde_avro_slice")]
+/// #[serde(with = "apache_avro::serde::slice")]
/// slice_field: &'a [u8],
/// }
/// ```
///
/// [`Value::Bytes`]: crate::types::Value::Bytes
/// [`Value::Fixed`]: crate::types::Value::Fixed
-pub mod serde_avro_slice {
+/// [`apache_avro::serde::slice`]: slice_opt
+pub mod slice {
use super::DE_BYTES_BORROWED;
use serde::{Deserializer, Serializer};
@@ -335,24 +341,25 @@ pub mod serde_avro_slice {
/// Note that `&[u8]` are always serialized as [`Value::Bytes`]. However,
/// both [`Value::Bytes`] and [`Value::Fixed`] can be deserialized as `&[u8]`.
///
-/// Use [`serde_avro_slice`] for non-optional bytes/fixed borrowed values.
+/// Use [`apache_avro::serde::slice`] for non-optional bytes/fixed borrowed values.
///
/// See usage with below example:
-/// ```rust
-/// use apache_avro::{AvroSchema, serde_avro_slice_opt};
-/// use serde::{Deserialize, Serialize};
+/// ```
+/// # use apache_avro::AvroSchema;
+/// # use serde::{Deserialize, Serialize};
///
/// #[derive(AvroSchema, Serialize, Deserialize)]
/// struct StructWithBytes<'a> {
/// #[avro(with)]
-/// #[serde(with = "serde_avro_slice_opt")]
+/// #[serde(with = "apache_avro::serde::slice_opt")]
/// slice_field: Option<&'a [u8]>,
/// }
/// ```
///
/// [`Value::Bytes`]: crate::types::Value::Bytes
/// [`Value::Fixed`]: crate::types::Value::Fixed
-pub mod serde_avro_slice_opt {
+/// [`apache_avro::serde::slice`]: mod@slice
+pub mod slice_opt {
use super::DE_BYTES_BORROWED;
use serde::{Deserializer, Serializer};
use std::borrow::Borrow;
@@ -390,7 +397,6 @@ pub mod serde_avro_slice_opt {
#[cfg(test)]
mod tests {
- use super::*;
use crate::{Schema, from_value, to_value, types::Value};
use serde::{Deserialize, Serialize};
@@ -398,19 +404,19 @@ mod tests {
fn avro_3631_validate_schema_for_struct_with_byte_types() {
#[derive(Debug, Serialize)]
struct TestStructWithBytes<'a> {
- #[serde(with = "serde_avro_bytes")]
+ #[serde(with = "crate::serde::bytes")]
vec_field: Vec<u8>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
vec_field_opt: Option<Vec<u8>>,
- #[serde(with = "serde_avro_fixed")]
+ #[serde(with = "crate::serde::fixed")]
fixed_field: [u8; 6],
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field_opt: Option<[u8; 7]>,
- #[serde(with = "serde_avro_slice")]
+ #[serde(with = "crate::serde::slice")]
slice_field: &'a [u8],
- #[serde(with = "serde_avro_slice_opt")]
+ #[serde(with = "crate::serde::slice_opt")]
slice_field_opt: Option<&'a [u8]>,
}
@@ -465,32 +471,32 @@ mod tests {
fn avro_3631_deserialize_value_to_struct_with_byte_types() {
#[derive(Debug, Deserialize, PartialEq)]
struct TestStructWithBytes<'a> {
- #[serde(with = "serde_avro_bytes")]
+ #[serde(with = "crate::serde::bytes")]
vec_field: Vec<u8>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
vec_field_opt: Option<Vec<u8>>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
vec_field_opt2: Option<Vec<u8>>,
- #[serde(with = "serde_avro_fixed")]
+ #[serde(with = "crate::serde::fixed")]
fixed_field: [u8; 6],
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field_opt: Option<[u8; 7]>,
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field_opt2: Option<[u8; 8]>,
- #[serde(with = "serde_avro_slice")]
+ #[serde(with = "crate::serde::slice")]
slice_bytes_field: &'a [u8],
- #[serde(with = "serde_avro_slice_opt")]
+ #[serde(with = "crate::serde::slice_opt")]
slice_bytes_field_opt: Option<&'a [u8]>,
- #[serde(with = "serde_avro_slice_opt")]
+ #[serde(with = "crate::serde::slice_opt")]
slice_bytes_field_opt2: Option<&'a [u8]>,
- #[serde(with = "serde_avro_slice")]
+ #[serde(with = "crate::serde::slice")]
slice_fixed_field: &'a [u8],
- #[serde(with = "serde_avro_slice_opt")]
+ #[serde(with = "crate::serde::slice_opt")]
slice_fixed_field_opt: Option<&'a [u8]>,
- #[serde(with = "serde_avro_slice_opt")]
+ #[serde(with = "crate::serde::slice_opt")]
slice_fixed_field_opt2: Option<&'a [u8]>,
}
@@ -594,46 +600,46 @@ mod tests {
array_field: &'a [u8],
vec_field: Vec<u8>,
- #[serde(with = "serde_avro_fixed")]
+ #[serde(with = "crate::serde::fixed")]
vec_field2: Vec<u8>,
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
vec_field2_opt: Option<Vec<u8>>,
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
vec_field2_opt2: Option<Vec<u8>>,
- #[serde(with = "serde_avro_bytes")]
+ #[serde(with = "crate::serde::bytes")]
vec_field3: Vec<u8>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
vec_field3_opt: Option<Vec<u8>>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
vec_field3_opt2: Option<Vec<u8>>,
- #[serde(with = "serde_avro_fixed")]
+ #[serde(with = "crate::serde::fixed")]
fixed_field: [u8; 6],
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field_opt: Option<[u8; 5]>,
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field_opt2: Option<[u8; 4]>,
- #[serde(with = "serde_avro_fixed")]
+ #[serde(with = "crate::serde::fixed")]
fixed_field2: &'a [u8],
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field2_opt: Option<&'a [u8]>,
- #[serde(with = "serde_avro_fixed_opt")]
+ #[serde(with = "crate::serde::fixed_opt")]
fixed_field2_opt2: Option<&'a [u8]>,
- #[serde(with = "serde_avro_bytes")]
+ #[serde(with = "crate::serde::bytes")]
bytes_field: &'a [u8],
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
bytes_field_opt: Option<&'a [u8]>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
bytes_field_opt2: Option<&'a [u8]>,
- #[serde(with = "serde_avro_bytes")]
+ #[serde(with = "crate::serde::bytes")]
bytes_field2: [u8; 6],
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
bytes_field2_opt: Option<[u8; 7]>,
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "crate::serde::bytes_opt")]
bytes_field2_opt2: Option<[u8; 8]>,
}
diff --git a/avro/tests/avro-rs-285-bytes_deserialization.rs b/avro/tests/avro-rs-285-bytes_deserialization.rs
index 5ac2688..b9ebe80 100644
--- a/avro/tests/avro-rs-285-bytes_deserialization.rs
+++ b/avro/tests/avro-rs-285-bytes_deserialization.rs
@@ -20,7 +20,7 @@ use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, PartialEq, Serialize)]
struct ExampleByteArray {
- #[serde(with = "apache_avro::serde_avro_bytes_opt")]
+ #[serde(with = "apache_avro::serde::bytes_opt")]
data_bytes: Option<Vec<u8>>,
description: Option<String>,
}
diff --git a/avro_derive/tests/serde.rs b/avro_derive/tests/serde.rs
index 043a245..e14503d 100644
--- a/avro_derive/tests/serde.rs
+++ b/avro_derive/tests/serde.rs
@@ -570,33 +570,28 @@ mod field_attributes {
#[test]
fn avro_rs_397_avroschema_with_bytes() {
- use apache_avro::{
- serde_avro_bytes, serde_avro_bytes_opt, serde_avro_fixed, serde_avro_fixed_opt,
- serde_avro_slice, serde_avro_slice_opt,
- };
-
#[expect(dead_code, reason = "We only care about the schema")]
#[derive(AvroSchema)]
struct TestStructWithBytes<'a> {
#[avro(with)]
- #[serde(with = "serde_avro_bytes")]
+ #[serde(with = "apache_avro::serde::bytes")]
vec_field: Vec<u8>,
#[avro(with)]
- #[serde(with = "serde_avro_bytes_opt")]
+ #[serde(with = "apache_avro::serde::bytes_opt")]
vec_field_opt: Option<Vec<u8>>,
- #[avro(with = serde_avro_fixed::get_schema_in_ctxt::<6>)]
- #[serde(with = "serde_avro_fixed")]
+ #[avro(with = apache_avro::serde::fixed::get_schema_in_ctxt::<6>)]
+ #[serde(with = "apache_avro::serde::fixed")]
fixed_field: [u8; 6],
- #[avro(with = serde_avro_fixed_opt::get_schema_in_ctxt::<7>)]
- #[serde(with = "serde_avro_fixed_opt")]
+ #[avro(with = apache_avro::serde::fixed_opt::get_schema_in_ctxt::<7>)]
+ #[serde(with = "apache_avro::serde::fixed_opt")]
fixed_field_opt: Option<[u8; 7]>,
#[avro(with)]
- #[serde(with = "serde_avro_slice")]
+ #[serde(with = "apache_avro::serde::slice")]
slice_field: &'a [u8],
#[avro(with)]
- #[serde(with = "serde_avro_slice_opt")]
+ #[serde(with = "apache_avro::serde::slice_opt")]
slice_field_opt: Option<&'a [u8]>,
}