3个版本
0.1.2 | 2023年10月28日 |
---|---|
0.1.1 | 2023年10月28日 |
0.1.0 | 2023年10月28日 |
#966 in 过程宏
每月下载 28次
17KB
107 行
Behavior
一个宏检查类似于elixir语言中的"行为"。
示例
"行为"被定义为包含所有静态方法的特质。而 behavior::behavior
宏检查所有给定的模块是否实现了行为特质。
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct User {
name: String,
age: u8,
}
#[behavior::behavior(modules(original, fake))] // check behaviors
#[async_trait::async_trait]
trait MyBehavior {
async fn get<T: DeserializeOwned>(url: String) -> T;
fn post_user<'a>(url: String, user: &'a User) -> u16;
}
mod original {
use super::User;
pub async fn get<T: serde::de::DeserializeOwned>(url: String) -> T {
let res = reqwest::Client::new().get(&url).send().await.unwrap();
res.json().await.unwrap()
}
pub fn post_user(url: String, user: &User) -> u16 {
reqwest::blocking::Client::new()
.post(&url)
.json(user)
.send()
.unwrap()
.status()
.as_u16()
}
}
mod fake {
use super::User;
pub async fn get<T: serde::de::DeserializeOwned>(_url: String) -> T {
serde_json::from_str("{}").unwrap()
}
pub fn post_user(_url: String, _user: &User) -> u16 {
200
}
}
它在使用功能标志时确保API非常有用。
#[cfg(feature = "fake")]
pub use fake::*;
#[cfg(not(feature = "fake"))]
pub use original::*;
因为宏为每个模块生成一个实现行为特质的类型(在示例中,FakeModuleMyBehavior
和 OriginalModuleMyBehavior
),所以您可以将行为用作正常的特质。但并不推荐这样做。
依赖
~0.6–1MB
~24K SLoC