2个版本
0.1.1 | 2022年11月26日 |
---|---|
0.1.0 | 2022年9月10日 |
#13 in #timed
每月下载 28 次
用于 inpt
32KB
805 行
Inpt
Inpt是一个用于简单类型级别文本解析的 derive crate。
阅读最新文档以获取更多信息。
介绍
想象你需要切割一个令人烦恼的字符串,并将所有部分转换为有用的类型。你可以使用 split
和 from_str
编写这样的代码,但快速解包和检查的样板代码很快就会失去所有的魅力。特别是在像 advent of code 这样的计时编程比赛中经常出现这种解析。
Inpt试图为你编写这种解析代码,自动根据字段类型和可选的正则表达式分割输入字符串。Inpt绝对 不是 性能、严格或正式的。在可能的情况下,它做显而易见的事情
#[inpt::main]
fn main(x: f32, y: f32) {
println!("{}", x * y);
}
$ echo '6,7' | cargo run
42
示例
use inpt::{Inpt, inpt};
#[derive(Inpt)]
#[inpt(regex = r"(.)=([-\d]+)\.\.([-\d]+),?")]
struct Axis {
name: char,
start: i32,
end: i32,
}
#[derive(Inpt)]
#[inpt(regex = "target area:")]
struct Target {
#[inpt(after)]
axes: Vec<Axis>,
}
impl Target {
fn area(&self) -> i32 {
self.axes.iter().map(|Axis { start, end, ..}| end - start).product()
}
}
let target = inpt::<Target>("target area: x=119..176, y=-114..84").unwrap();
assert_eq!(target.area(), 11286);
依赖关系
~3.5MB
~91K SLoC