#macro #unit-testing #options #why #try

koption_macros

一些在处理 Option 时有用的宏

2 个版本

0.1.1 2019 年 7 月 29 日
0.1.0 2019 年 7 月 10 日

#2167 in Rust 模式

MIT/Apache

5KB
70

koption_macros

一些在处理 Option 时有用的宏。

  • or!: or!(optA => optB => optC) 将选择第一个非 None 的值,类似于 SQL 中的 COALESCE
  • and!: and!(optA => optB => optC) 当所有值都是 Some 时将生成一个元组 (A, B, C)
  • try_!: 这是对 try 块的 Option 专用版本,与 nightly 版本中的 try 块相比,它在类型推断方面似乎表现更好。

一旦我能想出如何使用 proc_macros,我计划添加至少一个新功能。

示例

直接来自单元测试。

#[test]
fn or_works() {
    assert_eq!(Some(1), or!(Some(1) => Some(2) => Some(3)));
    assert_eq!(Some(2), or!(None => Some(2) => Some(3)));
    assert_eq!(Some(3), or!(None => None => Some(3)));
    assert_eq!(None::<()>, or!(None => None => None));
}

#[test]
fn and_works() {
    assert_eq!(Some((1, 2, 3)), and!(Some(1) => Some(2) => Some(3)));
    assert_eq!(None, and!(None => Some(2) => Some(3)));
    assert_eq!(None, and!(None => None => Some(3)));
    assert_eq!(None, and!(None => None => None));
}

struct Config {
    log: Option<LogConfig>,
}

struct LogConfig {
    level: Option<String>,
}

#[test]
fn try_works() {
    assert_eq!(
        Some(6),
        try_! {
            let x = Some(3);
            let y = Some(2);
            x? * y?
        }
    );

    let config = Config {
        log: Some(LogConfig {
            level: Some("debug".to_owned()),
        }),
    };

    let x = try_! { config.log?.level? }.unwrap_or("foo".to_owned());
    assert_eq!(x, "debug");
}

为什么是 koption_macros?

这是我用我的姓氏首字母 k 对我的 crate 进行命名空间化的版本。

没有运行时依赖