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 中使用
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
方法。它包含两个属性,path
和requires
(可选)。
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