#enums #macro-derive #contract #strongly-typed #macro #pub-sub

enum2contract

enum2contract 是一个与 no_std 兼容的 Rust derive 宏,允许用户使用强类型 Rust 枚举指定 pub/sub 风格消息的合约。为生成的有效载荷创建 JSON 和二进制转换方法。

7 个版本

0.1.6 2023年4月11日
0.1.5 2023年4月10日
0.1.3 2023年3月26日

553进程宏 中排名

Download history 113/week @ 2024-04-06 106/week @ 2024-04-13 98/week @ 2024-04-20 67/week @ 2024-04-27 162/week @ 2024-05-04 191/week @ 2024-05-11 171/week @ 2024-05-18 129/week @ 2024-05-25 106/week @ 2024-06-01 147/week @ 2024-06-08 90/week @ 2024-06-15 200/week @ 2024-06-22 20/week @ 2024-06-29 59/week @ 2024-07-06 86/week @ 2024-07-13 55/week @ 2024-07-20

每月下载量 255

MIT 许可证

14KB
209

enum2contract

github crates.io docs.rs

enum2contract 是一个与 no_std 兼容的 Rust derive 宏,允许用户使用强类型 Rust 枚举指定 pub/sub 风格消息的合约。

为生成的有效载荷创建 JSON 和二进制转换方法。

用法

将此内容添加到您的 Cargo.toml

enum2contract = "0.1.6"
serde = { version = "1.0.158", default-features = false, features = ["derive"] }
serde_json = { version = "1.0.94", default-features = false, features = ["alloc"] }
postcard = { version = "1.0.4", features = ["alloc"] }

示例

use enum2contract::EnumContract;
use serde::{Deserialize, Serialize};

#[derive(EnumContract)]
pub enum Message {
    #[topic("notify/{group}")]
    Notify,

    #[topic("notify_all")]
    NotifyAll,

    #[topic("system/{id}/start/{mode}")]
    Start { immediate: bool, timeout: u64 },
}

#[test]
fn topic() {
    assert_eq!(Message::notify_topic("subset"), "notify/subset");

    assert_eq!(Message::notify_all_topic(), "notify_all");

    assert_eq!(
        Message::start_topic(&3.to_string(), "idle"),
        "system/3/start/idle"
    );
}

#[test]
fn message() {
    assert_eq!(
        Message::notify("subgroup"),
        ("notify/subgroup".to_string(), NotifyPayload::default())
    );

    assert_eq!(
        Message::notify_all(),
        ("notify_all".to_string(), NotifyAllPayload::default())
    );

    assert_eq!(
        Message::start(&3.to_string(), "idle"),
        ("system/3/start/idle".to_string(), StartPayload::default())
    );
}

#[test]
fn notify_payload_from_json_with_data() {
    let json = r#"{"immediate":true,"timeout":40}"#;
    let payload = StartPayload::from_json(json).unwrap();
    assert_eq!(
        payload,
        StartPayload {
            immediate: true,
            timeout: 40,
        }
    );
}

此包与 #![no_std] 兼容,但需要 alloc

依赖项

~0.9–1.6MB
~37K SLoC