#routing #uri #enums #routes #path #flattened #router

uri_path_router

一个进程宏crate,用于生成用于路由的扁平枚举

1个不稳定版本

0.1.0 2022年6月2日

过程宏 中排名第 1373

MIT 许可证

17KB
392

uri_path_router

该库提供了一个过程宏,它使用一个小型的领域特定语言来创建一个简单的解析器,该解析器可以将URI的路径转换为用于路由目的的扁平枚举的变体。

生成的逻辑基本上是一个大的嵌套 match,它贪婪地接受一个输入 &str,将其分割为用 / 字符分隔的段,并输出枚举的一个变体,如果指定为变量,则捕获路径的段。

用法

您编写如下

use uri_path_router::route;

route! {
    Router,
    "foo" => VariantA,
    "bar" => VariantBar {
        "x" => BarX,
        var => BarWithVariable(var)
    },
    "nested" / "syntax" / "demonstration" => Nested,
}

该宏将生成一个扁平的 enum,如下所示

pub enum Router<'a> {
    VariantA,
    VariantBar,
    BarX,
    BarWithVariable { var: &'a str },
    Nested,
}

请注意,只有当变体指定时,枚举才会捕获变量,并且始终作为借用进行,因此不会进行任何分配。要将 &str 转换为变体,请使用 TryFrom

assert_eq!(Router::try_from("/foo"), Ok(Router::VariantA));
assert_eq!(Router::try_from("/bar"), Ok(Router::VariantBar));
assert_eq!(Router::try_from("/bar/x"), Ok(Router::BarX));
assert_eq!(
    Router::try_from("/bar/not-x"),
    Ok(Router::BarWithVariable { var: "not-x" })
);
assert_eq!(Router::try_from("/whatever"), Err(()));
assert_eq!(
    Router::try_from("/nested/syntax/demonstration"),
    Ok(Router::Nested)
);

此crate的一个巧妙功能是自动为枚举的每个变体生成文档,描述它匹配的模式。您可以通过在IDE中悬停(假设您已配置 rust-analyzer 或类似工具以显示工具提示)或通过在您的crate上运行 cargo doc 并搜索生成的枚举来查看这些信息。

许可证

本库在MIT许可证下提供。请参阅 LICENSE

依赖关系

~1.5MB
~36K SLoC