#regex-parser #parser #regex #aoc #text-parser

inpt

A derive crate for dumb type-level text parsing

4个版本

0.1.3 2023年1月17日
0.1.2 2022年12月11日
0.1.1 2022年11月26日
0.1.0 2022年9月10日

#133 in 解析工具

MIT许可证

56KB
927 代码行,不包括注释

Inpt

Inpt是一个用于简单类型级文本解析的derive crate。

阅读最新文档获取更多信息。

简介

想象一下,你需要分割一个讨厌的字符串,并将所有部分转换为有用的类型。你可以通过手动使用splitfrom_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);

依赖项

~5–13MB
~148K SLoC