6个稳定版本
1.0.5 | 2023年4月20日 |
---|---|
1.0.4 | 2021年8月31日 |
1.0.2 | 2021年8月27日 |
#824 在 配置
每月 325次下载
在 2 个包中使用 (通过 obake)
33KB
794 代码行
妖怪
Obake
Rust的版本化数据结构。
在docs.rs上查看 »
关于
Obake是一个用于声明和维护版本化数据结构的过程宏。名称“Obake”来自日语“お化け(おばけ)”,是日本民间传说中的一类会变形的妖怪。
在开发应用程序时,配置格式和内部数据结构通常会在版本之间演变。然而,在版本之间保持向后兼容性需要声明和维护用于旧格式以及用于在这些格式之间迁移的代码的数据结构。Obake旨在使这个过程变得轻松。
入门
要开始,请将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
obake = "1.0"
示例
#[obake::versioned] // create a versioned data-structure
#[obake(version("0.1.0"))] // declare some versions
#[obake(version("0.2.0"))]
#[derive(Debug, PartialEq, Eq)] // additional attributes are applied to all versions
struct Foo {
#[obake(cfg("0.1.0"))] // enable fields for specific versions with
foo: String, // semantic version constraints
#[obake(cfg(">=0.2, <=0.3.0"))] // any semantic version constraint can appear in
bar: u32, // a `cfg` attribute
#[obake(cfg("0.1.0"))] // multiple `cfg` attributes are treated as a
#[obake(cfg(">=0.3"))] // disjunction over version constraints
baz: char,
}
// describe migrations between versions using the `From` trait
// and an automatically generated type-level macro for referring to
// specific versions of `Foo`
impl From<Foo!["0.1.0"]> for Foo!["0.2.0"] {
fn from(foo: Foo!["0.1.0"]) -> Self {
Self { bar: 0 }
}
}
// an enumeration of all versions of `Foo` is accessed using the `obake::AnyVersion` type
// alias
let versioned_example: obake::AnyVersion<Foo> = (Foo { bar: 42 }).into();
// this enumeration implements `Into<Foo>`, where `Foo` is the latest declared
// version of `Foo` (in this case, `Foo!["0.2.0"]`)
let example: Foo = versioned_example.into();
assert_eq!(example, Foo { bar: 42 });
其他功能
#[obake(inherit)]
: 允许嵌套版本化数据结构。#[obake(derive(...))]
: 允许将 derive 属性应用于生成的枚举。#[obake(serde(...))]
: 允许将serde
属性应用于生成的enum
。- 注意:需要
serde
功能。
- 注意:需要
限制
- 不能应用于元组结构体(或没有命名字段的枚举变体)。
- 不能应用于具有泛型参数的项。
许可证
根据您的选择,在以下两者之一下授权:Apache License, Version 2.0 或 MIT 许可证。除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给 Obake 的任何贡献都应如上双授权,不附加任何额外条款或条件。
依赖项
~1.5MB
~37K SLoC