6 个稳定版本

1.0.5 2023 年 4 月 20 日
1.0.4 2021 年 8 月 31 日
1.0.2 2021 年 8 月 27 日

#88 in 配置

Download history 84/week @ 2024-03-11 91/week @ 2024-03-18 64/week @ 2024-03-25 209/week @ 2024-04-01 63/week @ 2024-04-08 147/week @ 2024-04-15 82/week @ 2024-04-22 67/week @ 2024-04-29 74/week @ 2024-05-06 57/week @ 2024-05-13 70/week @ 2024-05-20 40/week @ 2024-05-27 72/week @ 2024-06-03 74/week @ 2024-06-10 104/week @ 2024-06-17 63/week @ 2024-06-24

每月 316 次下载
arrpc 中使用

MIT/Apache

17KB
103

Build Issues crates.io License


妖怪

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.0MIT许可证
除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交以包含在Obake中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1.5MB
~36K SLoC