#tuple #struct #convert

struple

在结构和元组之间进行转换

2个版本

0.1.1 2021年11月2日
0.1.0 2020年2月1日

#2638 in Rust模式

Download history 16/week @ 2024-03-11 13/week @ 2024-03-18 29/week @ 2024-03-25 62/week @ 2024-04-01 28/week @ 2024-04-08 80/week @ 2024-04-15 36/week @ 2024-04-22 13/week @ 2024-04-29 23/week @ 2024-05-06 27/week @ 2024-05-13 10/week @ 2024-05-20 4/week @ 2024-05-27 21/week @ 2024-06-03 86/week @ 2024-06-10 14/week @ 2024-06-17 18/week @ 2024-06-24

每月 139 次下载

MIT/Apache

9KB

Struple

Crate Docs

为您的结构体派生一个特质,以实现元组与结构体之间的转换。

基本示例

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.0MIT许可证的许可。
除非您明确说明,否则根据Apache-2.0许可证定义的任何有意提交以包含在此crate中的贡献,均应按上述方式双许可,不附加任何额外的条款或条件。

依赖项

~1.5MB
~35K SLoC