14 个稳定版本

2.1.0 2021 年 4 月 1 日
2.0.0 2021 年 4 月 1 日
1.11.0 2021 年 3 月 31 日

#1856Rust 模式

50 每月下载次数

MIT 或 Apache-2.0 或 GPL-2.0-only

75KB
2K SLoC

Assure:Rust 运行时检查宏

这个 Rust 包提供宏 assure! 和相关宏。

这些宏故意与宏 assert! 和相关宏相似。

可通过 https://crates.io/crates/assure 获取

简介

assure 宏的工作方式如下

  • assure!(x) 返回带有 Ok(x)Err("assure")Result

  • assure_eq(x, y) 返回带有 Ok(x)Err("assure_eq left:1 right:2")Result

比较 assert 宏的工作方式如下

  • assert!(x) 成功返回或调用 panic!

  • assert_eq!(x, y) 成功返回或调用 panic!

返回 Ok 或 Err

assure 宏返回带有以下之一的 Result

  • Ok() 带有最左侧的宏参数。

  • Err() 带有用于诊断的生成错误信息。

Ok 的示例

let a = 1;
let b = 1;
assure_eq!(a, b);
//-> Ok(a)

Err 的示例

let a = 1;
let b = 2;
assure_eq!(a, b);
//-> Err("assure_eq left:1 right:2")

用法

《assure》宏可以与《?` 操作符一起使用,用于检查。

以下示例函数使用了《assure_gt!` 宏,表示确保大于。

fn sum_positive_numbers(a: i32, b: i32) -> Result<i32, String> {
    assure_gt!(a, 0)?;
    assure_gt!(b, 0)?;
    Ok(a + b)
}

Ok 的示例

sum_positive_numbers(1, 2);
//-> Ok(3)

Err 的示例

sum_positive_numbers(1, -2);
//-> Err("assure_gt left:-2 right:0)

自定义错误信息

《assure》宏会生成一个默认的诊断错误信息,例如

  • assure_eq!(1, 2)` 返回 Err("assure_eq left:1 right:2")`。

宏还有第二种形式,可以通过最后一个参数提供自定义错误信息

  • assure_eq!(1, 2, "message")` 返回 Err("message")`。

示例错误信息

fn sum_positive_numbers(a: i32, b: i32) -> Result<i32, String> {
    assure_gt!(a, 0, "param 1 must be postive but is {}", a)?;
    assure_gt!(b, 0, "param 2 must be postive but is {}", b)?;
    Ok(a + b)
}

简单值的宏

真值检查宏

  • assure!(a)`: 确保 a 为真。

值比较宏

  • assure_eq!(a, b)`: 确保 a 等于 b

  • assure_ne!(a, b)`: 确保 a 不等于 b

  • assure_lt!(a, b)`: 确保 a 小于 b

  • assure_le!(a, b)`: 确保 a 小于或等于 b

  • assure_gt!(a, b)`: 确保 a 大于 b

  • assure_ge!(a, b)`: 确保 a 大于或等于 b

集合检查宏

assure_set…!` 宏帮助比较集合参数,例如比较两个数组或两个向量。其中项目顺序无关紧要,项目数量也无关紧要。

  • assure_set_eq(a, b)`: 确保 a 集合等于 b 集合。

  • assure_set_ne(a, b)`: 确保 a 集合不等于 b 集合。

Ok 的示例

let a = [1, 2];
let b = [2, 1];
assure_set_eq!(&a, &b);
//-> Ok(&a)

Err 的示例

let a = [1, 2];
let b = [3, 4];
assure_set_eq!(&a, &b);
//-> Err("assure_set_eq left:{1, 2} right:{3, 4}")

包检查宏

assure_bag…!` 宏帮助比较包参数,例如比较两个数组或两个向量,其中项目顺序无关紧要,但项目数量很重要。

  • assure_bag_eq(a, b):确保袋子a等于袋子b

  • assure_bag_ne(a, b):确保袋子a不等于袋子b

Ok 的示例

let a = [1, 1];
let b = [1, 1];
assure_set_eq!(&a, &b);
//-> Ok(&a)

Err 的示例

let a = [1, 1];
let b = [1, 1, 1];
assure_set_eq!(&a, &b);
//-> Err("assure_bag_eq left:{1: 2} right:{1: 3}")

assure_io…!宏帮助进行与IO相关的检查,例如比较文件、流等。这些宏返回一个包含Ok(true)Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, message))Result

真值检查宏

  • assure_io!(a):确保a为真。

值比较宏

  • assure_io_eq!(a, b):确保a等于b

  • assure_io_ne!(a, b):确保a不等于b

  • assure_io_lt!(a, b):确保a小于b

  • assure_io_le!(a, b):确保a小于或等于b

  • assure_io_gt!(a, b):确保a大于b

  • assure_io_ge!(a, b):确保a大于或等于b

Ok 的示例

let a = 1;
let b = 1;
assure_io_eq!(a, b);
//-> Ok(a)

Err 的示例

let a = 1;
let b = 2;
assure_io_eq!(a, b);
//-> Err(
//       std::io::Error::new(
//           std::io::ErrorKind::InvalidInput, 
//           "assure_io_eq left:1 right:2"
//       )
//   )

无运行时依赖