Crate rsgen_avro

Source
Expand description

§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:

Generate Rust types from Avro schemas

Usage: rsgen-avro [OPTIONS] <GLOB_PATTERN> <OUTPUT_FILE>

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

Options:
      --fmt              Run rustfmt on the resulting <output-file>
      --nullable         Replace null fields with their default value when deserializing
      --precision <P>    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
      --extra_derives    Append extra derive macros list to the generated record structs
  -h, --help             Print help
  -V, --version          Print version

§Library usage

As a library, the basic usage is:

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.generate(&source, &mut out).unwrap();

This will generate the following output:

#[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)]
pub struct Test {
    #[serde(default = "default_test_a")]
    pub a: i64,
    pub b: String,
}

#[inline(always)]
fn default_test_a() -> i64 { 42 }

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

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:

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

See GeneratorBuilder documentation for all available options.

§Limitations

  • Avro schema namespace fields are ignored, therefore record names within a schema (and across schemas) must not conflict (i.e. must be unique).
  • Rust Option<T> are supported through Avro unions having "null" in their first position only (See #39)

Re-exports§

pub use apache_avro;

Structs§

Generator
The main component for generating Rust types from a Source.
GeneratorBuilder
A builder class to customize Generator.

Enums§

Error
Schema
Represents any valid Avro schema More information about Avro schemas can be found in the Avro Specification
Source
An input source for generating Rust types.

Type Aliases§

Result