enum2contract

github crates.io docs.rs

enum2contract is a no_std compatible rust derive macro that lets users specify contracts for pub/sub style messaging using strongly typed rust enums.

Usage

Add this to your Cargo.toml:

toml enum2contract = "0.1.4"

Example:

```rust 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 },

}

[test]

fn notifymessage() { let (topic, payload) = Message::notify("partial"); asserteq!(topic, "notify/partial"); assert_eq!(payload, NotifyPayload::default()); }

[test]

fn notifyallmessage() { let (topic, payload) = Message::notifyall(); asserteq!(topic, "notifyall"); asserteq!(payload, NotifyAllPayload::default()); }

[test]

fn startmessage() { let (topic, payload) = Message::start("76", "idle"); asserteq!(topic, "system/76/start/idle"); assert_eq!(payload, StartPayload { immediate: false }); }

[test]

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);

}

[test]

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);

}

[test]

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);

}

[test]

fn notifypayloadfromjson() { let json = "null"; let payload = NotifyPayload::fromjson(json).unwrap(); assert_eq!(payload, NotifyPayload::default()); }

[test]

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 but requires alloc.