1个不稳定版本

0.1.0 2020年2月1日

#112#combinator

Download history 16/week @ 2024-03-11 17/week @ 2024-03-18 35/week @ 2024-03-25 60/week @ 2024-04-01 36/week @ 2024-04-08 90/week @ 2024-04-15 47/week @ 2024-04-22 16/week @ 2024-04-29 28/week @ 2024-05-06 38/week @ 2024-05-13 13/week @ 2024-05-20 8/week @ 2024-05-27 23/week @ 2024-06-03 86/week @ 2024-06-10 17/week @ 2024-06-17 21/week @ 2024-06-24

147 每月下载次数
用于 struple

MIT/Apache

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