7 个版本
0.1.6 | 2023年4月11日 |
---|---|
0.1.5 | 2023年4月10日 |
0.1.3 | 2023年3月26日 |
553 在 进程宏 中排名
每月下载量 255
14KB
209 行
enum2contract
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