2个版本
0.1.1 | 2021年5月7日 |
---|---|
0.1.0 | 2021年5月6日 |
#2284 in 数据结构
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