14 个稳定版本
2.1.0 | 2021 年 4 月 1 日 |
---|---|
2.0.0 | 2021 年 4 月 1 日 |
1.11.0 | 2021 年 3 月 31 日 |
#1856 在 Rust 模式
50 每月下载次数
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}")
与IO相关的检查宏
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"
// )
// )