#api #generator #parser-generator #parser

blue_typemap

动态函数参数的 TypeMap 依赖注入方法

1 个稳定版本

1.0.0 2022年12月16日

#2841Rust 模式

Apache-2.0

11KB
161

Blue TypeMap

这是一个从这里复制的 TypeMap 系统,可用于创建更简洁的 API 的动态函数参数。

它与 BevyActix Web 使用的类似,现在你可以在自己的项目中使用它。我将它做成一个包的原因是在学习这个主题时感到沮丧,这样其他人就不必经历这个过程。强烈建议阅读上面的博客以获取更多信息。

示例用法

use blue_typemap::mutable::{Data, TypeMap, Data};

fn function1() {
    println!("no parameter");
}
fn function2(data: Data<u32>) {
    // be sure to use .get() to obtain the value
    let data = data.get();
    println!("an int {}", data);
}

fn function3(data: Data<&str>) {
    println!("a str {}", data.get());
}

fn function4(mut data: DataMut<i32>) {
    // they're sent as mutexguards and have deref, so can easily change values of,
    // thanks to help from bruh![moment] at Rust Programming Language discord server on thread
    // `Typemap dependency injection mutation`.
    let mut x = data;
    *x *= 2;
}

fn main() {
    // Create a TypeMap container
    let mut container = TypeMap::default();
    // Bind values to it
    container.bind(Data::new("Values"));
    container.bind(Data::new(vec!["name", "age", "birth"]));
    container.bind(Data::new(50u32));
    // Mutable values
    container.bind(DataMutStorage::new(10i32));
    // Call the functions
    container.call(function1);
    container.call(function2);
    container.call(function3);
    container.call(function4);
    // Works with closures too
    container.call(|fields: Data<Vec<&str>>| {
        for i in fields.get() {
            println!("Field: {}", i);
        }
    });
}

额外细节

目前它的速度非常非常慢,显然,比正常函数和函数调用慢得多。开销很大,使得它在性能至关重要的程序中不适用。因此,只在性能不是那么重要的情况下使用它。

目前支持大约20个参数。你可以通过运行 callable_tuple!tuple_from_tm! 宏来增加它,继续在 src/lib.rs 中它们所写的后面。并不是所有类型都受支持,所以你可能需要为你的类型实现 FromTypeMap<'a>

祝您旅途愉快!

无运行时依赖