enum2contract is a no_std compatible rust derive macro that lets users specify contracts for pub/sub style messaging using strongly typed rust enums.
Add this to your Cargo.toml
:
toml
enum2contract = "0.1.3"
Example:
```rust use enum2contract::EnumContract; use serde::{Deserialize, Serialize};
pub enum Message { #[topic("notify/{group}")] Notify,
#[topic("notify_all")]
NotifyAll,
#[topic("system/{id}/start/{mode}")]
Start { immediate: bool },
}
fn notifymessage() { let (topic, payload) = Message::notify("partial"); asserteq!(topic, "notify/partial"); assert_eq!(payload, NotifyPayload::default()); }
fn notifyallmessage() { let (topic, payload) = Message::notifyall(); asserteq!(topic, "notifyall"); asserteq!(payload, NotifyAllPayload::default()); }
fn startmessage() { let (topic, payload) = Message::start("76", "idle"); asserteq!(topic, "system/76/start/idle"); assert_eq!(payload, StartPayload { immediate: false }); }
fn notifypayloadjsonconversion() { let payload = NotifyPayload; let json = payload.tojson().unwrap(); assert_eq!(json, "null");
let payload2: NotifyPayload = NotifyPayload::from_json(&json).unwrap();
assert_eq!(payload2, payload);
}
fn notifyallpayloadjsonconversion() { let payload = NotifyAllPayload; let json = payload.tojson().unwrap(); asserteq!(json, "null");
let payload2: NotifyAllPayload = NotifyAllPayload::from_json(&json).unwrap();
assert_eq!(payload2, payload);
}
fn startpayloadjsonconversion() { let payload = StartPayload { immediate: true }; let json = payload.tojson().unwrap(); assert_eq!(json, r#"{"immediate":true}"#);
let payload2: StartPayload = StartPayload::from_json(&json).unwrap();
assert_eq!(payload2, payload);
}
fn notifypayloadfromjson() { let json = "null"; let payload = NotifyPayload::fromjson(json).unwrap(); assert_eq!(payload, NotifyPayload::default()); }
fn notifypayloadfromjsonwithdata() { let json = r#"{"immediate": true}"#; let payload = StartPayload::fromjson(json).unwrap(); assert_eq!(payload, StartPayload { immediate: true }); } ```
This crate is
#![no_std]
compatible!