rsgen-avro   ![latest] ![doc]

A command line tool and library for generating serde-compatible Rust types from Avro schemas. The apache-avro crate, which is re-exported, provides a way to read and write Avro data with such types.

Command line usage

Download the latest release.

Available options rsgen-avro --help:

```text Generate Rust types from Avro schemas

Usage: rsgen-avro [OPTIONS]

Arguments: Glob pattern to select Avro schema files The file where Rust types will be written, '-' for stdout

Options: --fmt Run rustfmt on the resulting --nullable Replace null fields with their default value when deserializing --precision

Precision for f32/f64 default values that aren't round numbers [default: 3] --union-deser Custom deserialization for apache-avro multi-valued union types --chrono-dates Use chrono::NaiveDateTime for date/timestamps logical types --derive-builders Derive builders for generated record structs --derive-schemas Derive AvroSchema for generated record structs -h, --help Print help -V, --version Print version ```

Library usage

As a libray, the basic usage is:

```rust use rsgen_avro::{Source, Generator};

let raw_schema = r#" { "type": "record", "name": "test", "fields": [ {"name": "a", "type": "long", "default": 42}, {"name": "b", "type": "string"} ] } "#;

let source = Source::SchemaStr(&raw_schema); let mut out = std::io::stdout();

let g = Generator::new().unwrap(); g.gen(&source, &mut out).unwrap(); ```

This will generate the following output:

```text

[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)]

pub struct Test { #[serde(default = "defaulttesta")] pub a: i64, pub b: String, }

[inline(always)]

fn defaulttesta() -> i64 { 42 } ```

Various Schema sources can be used with Generator::gen(source, output) method:

rust pub enum Source<'a> { Schema(&'a rsgen_avro::Schema), // Avro schema enum re-exported from `apache-avro` Schemas(&'a [rsgen_avro::Schema]), // A slice of Avro schema enums SchemaStr(&'a str), // Schema as a json string GlobPattern(&'a str), // Glob pattern to select schema files }

Note also that the Generator can be customized with a builder:

rust let gen = rsgen_avro::Generator::builder() .precision(2) .build() .unwrap();

See GeneratorBuilder documentation for all available options.

Limitations