#elixir #traits #check #macro #module #string #methods

behavior

一个宏检查类似于elixir中的"行为"

3个版本

0.1.2 2023年10月28日
0.1.1 2023年10月28日
0.1.0 2023年10月28日

#966 in 过程宏

每月下载 28次

MIT/Apache

17KB
107

Behavior

crates.io docs.rs

一个宏检查类似于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::*;

因为宏为每个模块生成一个实现行为特质的类型(在示例中,FakeModuleMyBehaviorOriginalModuleMyBehavior),所以您可以将行为用作正常的特质。但并不推荐这样做。

依赖

~0.6–1MB
~24K SLoC