2个版本

0.1.1 2021年5月7日
0.1.0 2021年5月6日

#2284 in 数据结构

MIT 协议

11KB
156 代码行

afmt

一个简单的Rust库,用于从字符串解析基本数据结构。

用法

您可以使用fmt宏将字符串格式指定给任何结构体,在该宏中,您可以指定一个字符串字面量序列和结构体成员名称的链,以表示结构的格式。

#[fmt("value: " v "--" f)]
struct Foo {
    v: u32,
    r: f64,
}

let f: Foo = "value: 65--3.14".parse()?;

限制

考虑我们想要解析类似于以下字符串

some text here 364

到具有String第一部分和u32第二部分的结构体。

如果我们尝试将其解析为以下格式属性

#[fmt(msg v)]
struct Foo {
    msg: String,
    v: u32,
}

结果将是模糊的,可能有多种解释

Foo {
    msg: "some text here ",
    v: 364,
}
Foo {
    msg: "some text here 3",
    v: 64,
}
Foo {
    msg: "some text here 36",
    v: 4,
}
            ...

这意味着我们必须在每一对捕获变量之间指定一些字面量分隔符。字面量分隔符的解析方式是,第一个匹配项会分割字符串,因此分隔符为" "的结果将是两部分:"some""text here 364",这并不是理想的。

因此,您应该考虑您能够轻松解析哪些字符串,通过考虑特殊分隔符,即分隔符不应出现在您想要捕获的数据中。

示例

#[macro_use] extern crate afmt;
#[fmt("value :" v)]
struct Foo {
    v: u32,
}

#[test]
fn it_works() {
    let f: Foo = "value: 65".parse().unwrap();
    assert_eq!(f.v, 65);
}
#[fmt("x[" x "] y[" y "]")]
struct Point {
    x: u32,
    y: u32,
}

#[test]
fn it_works() {
    let p: Point = "x[65] y[39]".parse().unwrap();
    assert_eq!(p.x, 65);
    assert_eq!(p.y, 39);
}
#[fmt("INFO: " msg)]
struct Bar {
    msg: String,
}

#[test]
fn it_works() {
    let b: Result<Bar,_> = "WARN: this is a warning".parse();
    assert!(b.is_err());
}

依赖项

~2MB
~50K SLoC