#context #scoped #generate #typed #macro #t-yped #c-ontexts

tyco

生成作用域化的 TYped COntexts 的宏

1 个不稳定版本

0.0.9 2024年4月23日

#1303Rust 模式

Download history 134/week @ 2024-04-21 30/week @ 2024-04-28 72/week @ 2024-05-05 151/week @ 2024-05-12 344/week @ 2024-05-19 169/week @ 2024-05-26 112/week @ 2024-06-02 86/week @ 2024-06-09 93/week @ 2024-06-16 43/week @ 2024-06-23 157/week @ 2024-06-30 73/week @ 2024-07-07 152/week @ 2024-07-14 99/week @ 2024-07-21 118/week @ 2024-07-28

每月下载量 443

MIT 许可证

16KB
143

tyco - 用于创建作用域化的 TYped COntexts 的 crate。

Crates.io docs.rs CI

此 crate 允许您在当前执行上下文中(同步或异步)定义和存储类型信息,并通过调用堆栈传递而无需在函数参数中显式指定。这对于在不干扰主要业务逻辑代码的情况下实现一些附加功能非常有用。

它受到了 opentelemetry::Context 的启发,类似于日志记录器存储 id log/slog/tracing,使用 TLS 存储和访问值。与 opentelemetry::Context 不同,它基本上是 HashMap<TypeId, Any>,当前的 crate 允许处理任何类型,这可能会(或可能不会)导致更高效和干净的代码。

示例

如何定义包含某些跟踪标识符的上下文的基本示例,这些标识符可用于区分 HTTP 请求等。

use tyco::{context, FutureExt, TypedContext};

mod trace_id {
    use super::*;

    #[derive(Clone, Default, Debug, PartialEq)]
    pub struct TraceId(String);

    tyco::context!(TraceId);
}

let t = trace_id::TraceId::default();

let spawned_fut = tokio::spawn(
    async { println!("{:?}", trace_id::TraceId::current()) }
    // 2 ways to pass context to spawned future
    .with_current::<trace_id::TraceId>()
    .with(t.clone()),
);

还可以查看更多复杂的 示例(例如,如何与 HTTP 服务器/客户端一起使用)。

依赖关系

~285–750KB
~17K SLoC