#derive #serialization #avro #data #apache-avro

macro apache-avro-derive

A library for deriving Avro schemata from Rust structs and enums

5 releases (breaking)

0.18.0 Apr 14, 2025
0.17.0 Aug 5, 2024
0.16.0 Sep 26, 2023
0.15.0 Jul 10, 2023
0.14.0 Aug 3, 2022

#39 in #avro

Download history 1865/week @ 2024-12-31 2657/week @ 2025-01-07 3406/week @ 2025-01-14 3346/week @ 2025-01-21 3104/week @ 2025-01-28 4158/week @ 2025-02-04 3122/week @ 2025-02-11 3731/week @ 2025-02-18 3803/week @ 2025-02-25 4337/week @ 2025-03-04 4302/week @ 2025-03-11 3384/week @ 2025-03-18 3774/week @ 2025-03-25 4231/week @ 2025-04-01 3747/week @ 2025-04-08 3748/week @ 2025-04-15

16,404 downloads per month
Used in 9 crates (via apache-avro)

Apache-2.0

31KB
590 lines

avro_derive

A proc-macro module for automatically deriving the avro schema for structs or enums. The macro produces the logic necessary to implement the AvroSchema trait for the type.

pub trait AvroSchema {
    // constructs the schema for the type
    fn get_schema() -> Schema;
}

How-to use

Add the "derive" feature to your apache-avro dependency inside cargo.toml

apache-avro = { version = "X.Y.Z", features = ["derive"] }

Add to your data model

#[derive(AvroSchema)]
struct Test {
    a: i64,
    b: String,
}

Example

use apache_avro::Writer;

#[derive(Debug, Serialize, AvroSchema)]
struct Test {
    a: i64,
    b: String,
}
// derived schema, always valid or code fails to compile with a descriptive message
let schema = Test::get_schema();

let mut writer = Writer::new(&schema, Vec::new());
let test = Test {
    a: 27,
    b: "foo".to_owned(),
};
writer.append_ser(test).unwrap();
let encoded = writer.into_inner();

Compatibility Notes

This module is designed to work in concert with the Serde implementation. If your use case dictates needing to manually convert to a Value type in order to encode then the derived schema may not be correct.

Dependencies

~1–1.8MB
~39K SLoC