You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2026/02/19 11:53:53 UTC
(avro-rs) 01/01: feat!: Use bon builder style instead of several methods
This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch use-bon-builder-style
in repository https://gitbox.apache.org/repos/asf/avro-rs.git
commit 58cfb998b3643e03ee3fa052fc3c70e1d781ddc7
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Thu Feb 19 13:48:34 2026 +0200
feat!: Use bon builder style instead of several methods
Instead of having several methods like: Schema::array(Schema) and
Schema::array_with_attributes(Schema, BTreeMap) we could use Bon's
function builders with start_fn:
```
Schema::array(Schema).call()
Schema::array(Schema).attributes(BTreeMap).call()
```
The only annoying part is the `.call()`
---
avro/src/decode.rs | 4 ++--
avro/src/encode.rs | 7 +++++--
avro/src/schema/mod.rs | 30 ++++++++++++++----------------
avro/src/schema_equality.rs | 4 ++--
avro/src/serde/derive.rs | 10 +++++-----
avro/src/types.rs | 4 ++--
6 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/avro/src/decode.rs b/avro/src/decode.rs
index d88ab5f..cfe069d 100644
--- a/avro/src/decode.rs
+++ b/avro/src/decode.rs
@@ -376,7 +376,7 @@ mod tests {
#[test]
fn test_decode_array_without_size() -> TestResult {
let mut input: &[u8] = &[6, 2, 4, 6, 0];
- let result = decode(&Schema::array(Schema::Int), &mut input);
+ let result = decode(&Schema::array(Schema::Int).call(), &mut input);
assert_eq!(Array(vec!(Int(1), Int(2), Int(3))), result?);
Ok(())
@@ -385,7 +385,7 @@ mod tests {
#[test]
fn test_decode_array_with_size() -> TestResult {
let mut input: &[u8] = &[5, 6, 2, 4, 6, 0];
- let result = decode(&Schema::array(Schema::Int), &mut input);
+ let result = decode(&Schema::array(Schema::Int).call(), &mut input);
assert_eq!(Array(vec!(Int(1), Int(2), Int(3))), result?);
Ok(())
diff --git a/avro/src/encode.rs b/avro/src/encode.rs
index 7efe4a6..a21a326 100644
--- a/avro/src/encode.rs
+++ b/avro/src/encode.rs
@@ -392,10 +392,13 @@ pub(crate) mod tests {
let empty: Vec<Value> = Vec::new();
encode(
&Value::Array(empty.clone()),
- &Schema::array(Schema::Int),
+ &Schema::array(Schema::Int).call(),
&mut buf,
)
- .expect(&success(&Value::Array(empty), &Schema::array(Schema::Int)));
+ .expect(&success(
+ &Value::Array(empty),
+ &Schema::array(Schema::Int).call(),
+ ));
assert_eq!(vec![0u8], buf);
}
diff --git a/avro/src/schema/mod.rs b/avro/src/schema/mod.rs
index 35372ce..01fc253 100644
--- a/avro/src/schema/mod.rs
+++ b/avro/src/schema/mod.rs
@@ -56,6 +56,7 @@ pub use crate::schema::{
resolve::ResolvedSchema,
union::UnionSchema,
};
+use bon::bon;
/// Represents documentation for complex Avro schemas.
pub type Documentation = Option<String>;
@@ -383,6 +384,7 @@ type DecimalMetadata = usize;
pub(crate) type Precision = DecimalMetadata;
pub(crate) type Scale = DecimalMetadata;
+#[bon]
impl Schema {
/// Converts `self` into its [Parsing Canonical Form].
///
@@ -664,16 +666,12 @@ impl Schema {
}
/// Returns a `Schema::Array` with the given items.
- pub fn array(items: Schema) -> Self {
- Schema::Array(ArraySchema {
- items: Box::new(items),
- default: None,
- attributes: Default::default(),
- })
- }
-
- /// Returns a `Schema::Array` with the given items and custom attributes.
- pub fn array_with_attributes(items: Schema, attributes: BTreeMap<String, JsonValue>) -> Self {
+ #[builder]
+ pub fn array(
+ #[builder(start_fn)] items: Schema,
+ attributes: Option<BTreeMap<String, JsonValue>>,
+ ) -> Self {
+ let attributes = attributes.unwrap_or_default();
Schema::Array(ArraySchema {
items: Box::new(items),
default: None,
@@ -1154,7 +1152,7 @@ mod tests {
#[test]
fn test_array_schema() -> TestResult {
let schema = Schema::parse_str(r#"{"type": "array", "items": "string"}"#)?;
- assert_eq!(Schema::array(Schema::String), schema);
+ assert_eq!(Schema::array(Schema::String).call(), schema);
Ok(())
}
@@ -1607,7 +1605,8 @@ mod tests {
aliases: None,
schema: Schema::array(Schema::Ref {
name: Name::new("Node")?,
- }),
+ })
+ .call(),
order: RecordFieldOrder::Ascending,
position: 1,
custom_attributes: Default::default(),
@@ -4682,10 +4681,9 @@ mod tests {
#[test]
fn test_avro_3927_serialize_array_with_custom_attributes() -> TestResult {
- let expected = Schema::array_with_attributes(
- Schema::Long,
- BTreeMap::from([("field-id".to_string(), "1".into())]),
- );
+ let expected = Schema::array(Schema::Long)
+ .attributes(BTreeMap::from([("field-id".to_string(), "1".into())]))
+ .call();
let value = serde_json::to_value(&expected)?;
let serialized = serde_json::to_string(&value)?;
diff --git a/avro/src/schema_equality.rs b/avro/src/schema_equality.rs
index e65e28c..58b1b01 100644
--- a/avro/src/schema_equality.rs
+++ b/avro/src/schema_equality.rs
@@ -475,11 +475,11 @@ mod tests {
#[test]
fn test_avro_3939_compare_array_schemata() {
- let schema_one = Schema::array(Schema::Boolean);
+ let schema_one = Schema::array(Schema::Boolean).call();
assert!(!SPECIFICATION_EQ.compare(&schema_one, &Schema::Boolean));
assert!(!STRUCT_FIELD_EQ.compare(&schema_one, &Schema::Boolean));
- let schema_two = Schema::array(Schema::Boolean);
+ let schema_two = Schema::array(Schema::Boolean).call();
let specification_eq_res = SPECIFICATION_EQ.compare(&schema_one, &schema_two);
let struct_field_eq_res = STRUCT_FIELD_EQ.compare(&schema_one, &schema_two);
diff --git a/avro/src/serde/derive.rs b/avro/src/serde/derive.rs
index c631db9..b17f259 100644
--- a/avro/src/serde/derive.rs
+++ b/avro/src/serde/derive.rs
@@ -524,7 +524,7 @@ macro_rules! impl_array_schema (
($type:ty where T: AvroSchemaComponent) => (
impl<T: AvroSchemaComponent> AvroSchemaComponent for $type {
fn get_schema_in_ctxt(named_schemas: &mut Names, enclosing_namespace: &Namespace) -> Schema {
- Schema::array(T::get_schema_in_ctxt(named_schemas, enclosing_namespace))
+ Schema::array(T::get_schema_in_ctxt(named_schemas, enclosing_namespace)).call()
}
fn get_record_fields_in_ctxt(_: usize, _: &mut Names, _: &Namespace) -> Option<Vec<RecordField>> {
@@ -544,7 +544,7 @@ where
T: AvroSchemaComponent,
{
fn get_schema_in_ctxt(named_schemas: &mut Names, enclosing_namespace: &Namespace) -> Schema {
- Schema::array(T::get_schema_in_ctxt(named_schemas, enclosing_namespace))
+ Schema::array(T::get_schema_in_ctxt(named_schemas, enclosing_namespace)).call()
}
fn get_record_fields_in_ctxt(
@@ -784,7 +784,7 @@ mod tests {
#[test]
fn avro_rs_401_slice() -> TestResult {
let schema = <[u8]>::get_schema();
- assert_eq!(schema, Schema::array(Schema::Int));
+ assert_eq!(schema, Schema::array(Schema::Int).call());
Ok(())
}
@@ -792,7 +792,7 @@ mod tests {
#[test]
fn avro_rs_401_array() -> TestResult {
let schema = <[u8; 55]>::get_schema();
- assert_eq!(schema, Schema::array(Schema::Int));
+ assert_eq!(schema, Schema::array(Schema::Int).call());
Ok(())
}
@@ -804,7 +804,7 @@ mod tests {
schema,
Schema::union(vec![
Schema::Null,
- Schema::array(Schema::array(Schema::Int))
+ Schema::array(Schema::array(Schema::Int).call()).call()
])?
);
diff --git a/avro/src/types.rs b/avro/src/types.rs
index 9c1f05f..5302851 100644
--- a/avro/src/types.rs
+++ b/avro/src/types.rs
@@ -1351,13 +1351,13 @@ mod tests {
),
(
Value::Array(vec![Value::Long(42i64)]),
- Schema::array(Schema::Long),
+ Schema::array(Schema::Long).call(),
true,
"",
),
(
Value::Array(vec![Value::Boolean(true)]),
- Schema::array(Schema::Long),
+ Schema::array(Schema::Long).call(),
false,
"Invalid value: Array([Boolean(true)]) for schema: Array(ArraySchema { items: Long, default: None, attributes: {} }). Reason: Unsupported value-schema combination! Value: Boolean(true), schema: Long",
),