5个版本 (3个重大更改)

0.8.0 2024年6月7日
0.7.2 2024年5月31日
0.7.0 2024年5月29日
0.6.1 2024年5月28日
0.5.0 2024年5月24日

#92 in #uri


2 crate 中使用

BSD-3-Clause

38KB
728

XAPI Oxidized Derive

该crate定义了在oxinate_core和根crate oxinat中找到的URI构建映射背后的“魔法”。主要用途是在核心库中生成相关的方法,这些方法最终会形成oxinat中的URI构建系统。

目前, derive宏不支持结构定义顶层单元结构,但支持常规结构和枚举。

use oxinat_derive::UriBuilder;

#[derive(Clone, Debug, Default, UriBuilder)]
#[match_path(path = "some/uri")]
#[match_path(path = "some/uri/{some_parameter}")]
struct SomeUriBuilder {
    #[param]
    some_parameter: Option<String>
}

属性指令

如上简要所述,有几个属性修饰符用于更深入地定义在构建时如何构建URI。重要的是要知道,匹配分支是按照每个#[match_path]声明的顺序构建的。

匹配路径

第一个,也是最重要的指令将是#[match_path]宏。这告诉oxinat_derive如何构建编译时定义的最终build方法。它包含两个属性,pathrequires(可选)。

  • path是必需的。这允许oxinat_derive知道应该为构建器构建什么和如何构建模式。
  • requires是一个可选属性。它接受一个布尔表达式的字符串(例如,"2+2 == 4")。这修改了匹配分支,使其仅在给定条件下有效。注意:在此范围内,属性将在构建器的'self'级别上进行匹配。

父级和参数

在构建最终 build 方法时的匹配分支中,#[parent]#[param] 的行为实际上是相同的。然而,在构建某些允许预构建定制的特定方法时,它们之间存在差异。

总的来说,从表面上看它们是一样的。在URI构建之前,将为这些字段实现方法,允许用户设置内部值。

例如

use oxinat_derive::UriBuilder;

#[derive(Clone, Debug, Default, UriBuilder)]
#[match_path(path = "{parent}/some/uri")]
#[match_path(path = "{parent}/some/uri/{some_parameter}")]
struct SomeUriBuilder {
    #[param]
    some_parameter: Option<String>
    #[parent]
    parent: Option<String>
}

// Under the hood, these methods will be implemented.
impl SomeUriBuilder {
    pub fn with_some_parameter(mut self, value: String) -> Self {
        ...
    }

    pub fn with_parent(mut self, value: String) -> Self {
        ...
    }
}

除了生成方法外,将字段声明为父级或参数,还可以通过一些附加属性进行一些定制。

  • requires 在参数级别上的行为类似于它在 #[match_path] 级别上的行为,但它是基于参数级别的。
  • map_from 允许在URI构建时对值进行特定的格式化/操作。

这两个指令的行为与 #[match_path(requires = "..")] 相同。这意味着它可以接受字符串布尔表达式,如闭包、函数或宏。

依赖项

~0.8–1.4MB
~27K SLoC