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 编码
每月 3,441 次下载
在 2 crates 中使用
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