4 个版本

0.1.3 2022 年 7 月 5 日
0.1.2 2022 年 7 月 4 日
0.1.1 2022 年 7 月 4 日
0.1.0 2022 年 7 月 4 日

#1996Rust 模式

Apache-2.0

18KB
253

🥯 bagel: 永远烘焙,永不油炸

Rust stable docs.rs Crates.io Discord GitHub Workflow Status

bagel 是一个宏和其他 东西 的集合,我们在 Skytable 中经常使用,主要用于在编译时完成工作(因为我们喜欢它烤制的样子 :P)。此软件包包含我们使用的部分内容,我们很快会添加更多的“魔法”。

导入

bagel = "0.1"

贝果能做什么

  • def: 使用 默认声明语法
  • Ctor: 继承构造函数
    • 支持完整的生命周期、泛型和 where 子句
    • #[phantom]: 自动省略 PhantomData 字段
    • #[ctor_const]: 将构造函数转换为 const fn
  • Gtor: 继承获取器
    • 支持完整的生命周期、泛型和 where 子句
    • 高级属性:#[gtor_const]#[gtor_copy]#[gtor_skip]#[phantom]#[gtor]
  • Stor: 继承设置器
    • 支持完整的生命周期、泛型和 where 子句
    • 使用 #[stor_skip]#[phantom] 跳过设置器
  • Constdef: 继承常量,编译时默认实现。请参阅 此处示例

默认声明语法

默认声明语法是为你结构体(和枚举很快)实现默认值的一种替代方法。它看起来是这样的

  1. 使用默认特性行为
    field: type
    
  2. 使用您指定的表达式
    field: type = expression
    

以下是一个示例

use bagel::def;

def! {
    #[derive(Debug)]
    pub struct MyOven {
        starting_temperature: u8,
        increment_temp_by: u8 = 1,
        oven_name: &'static str = "my_kitchen_wifi_oven1",
        items_to_bake: [&'static str; 4] = [
            "bagels",
            "hashbrowns",
            "cookies",
            "pie",
        ],
        people_buffer: Vec<String> = vec![
            "one for Jamie".into(),
            "another for Sophie".into()
        ],
    }
}

let mut myoven = MyOven::default();

assert_eq!(myoven.starting_temperature, 0);
assert_eq!(myoven.oven_name, "my_kitchen_wifi_oven1");
assert_eq!(myoven.items_to_bake[3], "pie");
assert_eq!(myoven.people_buffer.len(), 2);

Constdef 示例

use bagel::Constdef;

#[derive(Constdef)]
struct Port {
    requests: usize,
    admin: bool,
}

#[derive(Constdef)]
struct PortLogger {
    ports: [Port; 65536],
    root_pid: usize,
}

const PORT_LOGGER: PortLogger = PortLogger::default();

assert_eq!(PORT_LOGGER.ports[0].requests, 0);
assert_eq!(PORT_LOGGER.ports[65535].admin, false);

许可证

doughbagel 库在 Apache-2.0 许可证 下分发。

依赖项

~1.5MB
~35K SLoC