1个不稳定版本
0.1.0 | 2020年2月1日 |
---|
#112 在 #combinator
147 每月下载次数
用于 struple
5KB
73 行
Struple
为你的结构体派生一个tuple <-> struct转换特性。
基本示例
use struple::Struple
#[derive(Struple)]
struct Foo(String, 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解析组合器。这个组合器允许轻松地按顺序连接多个解析器,但缺点是你必须手动解构tuple来将数据放入相应的结构体中。这很麻烦,并且会使代码膨胀(至少在我看来是这样)。使用这个,可以为结构体派生一个tuple构造器,并将该构造器传递给map函数以将tuple映射到结构体。它甚至允许创建一个仅为此目的的新组合器
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版本或MIT许可证。除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交给此crate的贡献,将如上所述双重许可,没有额外的条款或条件。
依赖
~1.5MB
~35K SLoC