#avro #code-generation #serde #command-line-tool

bin+lib rsgen-avro

用于从 Avro 架构生成 Rust 类型的命令行工具和库

45 个版本

新版本 0.14.2 2024 年 8 月 12 日
0.13.0 2023 年 9 月 3 日
0.11.11 2023 年 4 月 16 日
0.11.9 2023 年 3 月 23 日
0.2.0 2018 年 11 月 4 日

#179 in 编码

Download history 409/week @ 2024-04-28 980/week @ 2024-05-05 1090/week @ 2024-05-12 1415/week @ 2024-05-19 1183/week @ 2024-05-26 1085/week @ 2024-06-02 1015/week @ 2024-06-09 566/week @ 2024-06-16 942/week @ 2024-06-23 1243/week @ 2024-06-30 675/week @ 2024-07-07 952/week @ 2024-07-14 762/week @ 2024-07-21 681/week @ 2024-07-28 925/week @ 2024-08-04 967/week @ 2024-08-11

每月 3,441 次下载
2 crates 中使用

MIT 许可证

92KB
2K SLoC

rsgen-avro   最新版 文档

A 命令行工具和库,用于从 serde 兼容的 Rust 类型生成 Avro 架构。重新导出的 apache-avro crate 提供了一种使用此类读取和写入 Avro 数据的方式。

命令行使用

下载最新 版本

可用选项 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
  -h, --help             Print help
  -V, --version          Print version

库使用

作为库,基本用法是

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();

这将生成以下输出

#[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 }

可以使用 Schema 源代码与 Generator::gen(source, output) 方法

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
}

注意,Generator 可以通过构建器进行自定义

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

有关所有可用选项的文档,请参阅 GeneratorBuilder

限制

  • Avro 架构的 namespace 字段被忽略,因此架构内部(以及架构之间)的记录名称不能冲突(即必须是唯一的)。
  • Rust 的 Option<T> 通过仅在 Avro 联合的第一个位置具有 "null" 的支持(见 #39

依赖关系

~14–25MB
~387K SLoC