#tuple #context #macro #provider #inject

no-std compost

添加了一个宏,可以将元组分解为包含其值子集的元组

5 个版本 (3 个破坏性更新)

0.4.0 2023年1月8日
0.3.0 2022年12月29日
0.2.0 2022年12月29日
0.1.1 2022年12月28日
0.1.0 2022年12月28日

#2256 in Rust 模式

MIT 许可证

41KB
432

Compost

Crates.io Docs.rs License

概述

此库公开了 decompose! 宏,用于将元组分解为包含其值子集的元组。

use compost::decompose;

// Pack all your context into a tuple...
let mut cx = (&mut 1u32, &2u8, (&3u16, &mut 'e', "f", &mut [1, 2, 3]));

// And cal your target function!
consumer(decompose!(cx));

// Define functions taking tuples of context...
fn consumer_2((a, b, c, d, e): (&u32, &str, &char, &f32, &i8)) {
    dbg!(a, b, c, d, e);
}

fn consumer_3((f, g, h): (&char, &str, &mut [u8; 3])) {
    dbg!(f, g, h);
}

fn consumer(mut cx: (&mut u32, &char, &str, &mut [u8; 3])) {
    // Bring types into scope and produce a remainder tuple.
    decompose!(cx => rest & {
        char: &char,
        bytes: &mut [u8; 3],
    });

    // Combine contexts...
    let mut rest = (rest, (&mut 4.3f32, &-4i8), &mut 5i16);

    // ...and forward them to further functions.
    consumer_2(decompose!(rest));

    // ...all without invalidating existing borrows!
    dbg!(char, bytes);

    // Reborrow the original context after its borrows have expired.
    consumer_3(decompose!(cx));
}

有关宏的精确语义和限制的详细信息,请参阅 decompose! 的文档。

功能

是的,此库...

  • 支持重新借用(即 decompose! 不会消耗其输入。一旦完成借用,可以重新使用原始元组)。
  • 如果元组不能分解,则在编译时产生(确实相当丑陋)的错误。
  • 支持借用可变、不可变和智能指针包装组件(只要它们实现 Deref)。
  • 支持从嵌套元组树借用,允许同时从任意数量的组件借用,并快速通过将它们打包到一个单个元组中合并多个上下文元组。
  • 支持在泛型元素上借用而不会在单态化时意外失败。
  • 依赖于类型推断而不是 TypeId,允许宏在非 'static 类型上操作。
  • 支持 no_std 环境,并且不依赖于不安全代码。
  • 没有运行时依赖。

没有运行时依赖