2个版本
0.1.1 | 2021年11月2日 |
---|---|
0.1.0 | 2020年2月1日 |
#2638 in Rust模式
每月 139 次下载
9KB
Struple
为您的结构体派生一个特质,以实现元组与结构体之间的转换。
基本示例
use struple::Struple
#[derive(Struple)]
struct Foo(&'static str, u64, f32);
fn main() {
let string = "hello";
let int = 3u64;
let float = 0.5f32;
let foo = Foo::from_tuple((string, int, float));
let (string, int, float) = foo.into_tuple();
}
使用场景
我创建这个crate的主要原因是nom和它的tuple解析器组合器。这个组合器允许轻松地将多个解析器按顺序链接,但缺点是您必须手动解构元组才能将数据放入相应的结构体中。这很繁琐,并且会使代码膨胀(至少在我看来是这样)。使用这个,可以为结构体派生一个元组构造器,并将其传递给map函数以将元组映射到结构体。它甚至允许创建一个仅为此目的的新组合器
pub fn struple<I, O1, O2, E, List>(l: List) -> impl Fn(I) -> nom::IResult<I, O2, E>
where
I: Clone,
O1: struple::GenericTuple,
O2: struple::Struple<Tuple = O1>,
E: nom::error::ParseError<I>,
List: nom::sequence::Tuple<I, O1, E>,
{
map(tuple(l), struple::Struple::from_tuple)
}
struct Vector3 {
x: f32,
y: f32,
z: f32
}
// with struple
let (i, vec): (_, Vector3) = struple((le_f32, le_f32, le_f32))?;
// without struple
let (i, vec) = map(
tuple((le_f32, le_f32, le_f32)),
|(x, y, z)| Vector3 { x, y, z}
)?;
许可证
根据您的选择,受Apache License, Version 2.0或MIT许可证的许可。除非您明确说明,否则根据Apache-2.0许可证定义的任何有意提交以包含在此crate中的贡献,均应按上述方式双许可,不附加任何额外的条款或条件。
依赖项
~1.5MB
~35K SLoC