diff --git a/rustecal-types-serde/Cargo.toml b/rustecal-types-serde/Cargo.toml index 5591883..33e0ea7 100644 --- a/rustecal-types-serde/Cargo.toml +++ b/rustecal-types-serde/Cargo.toml @@ -2,11 +2,18 @@ name = "rustecal-types-serde" version = "0.1.0" edition = "2021" +description = "JSON/CBOR/MessagePack support for rustecal TypedPublisher / TypedSubscriber" +license = "Apache-2.0" +repository = "https://github.com/eclipse-ecal/rustecal" +documentation = "https://docs.rs/rustecal-types-serde" +readme = "README.md" +keywords = ["ecal", "ipc", "pubsub", "message-support", "middleware"] +categories = ["network-programming", "api-bindings"] [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_cbor = "0.11" rmp-serde = "1.1" -rustecal-core = { path = "../rustecal-core" } -rustecal-pubsub = { path = "../rustecal-pubsub" } \ No newline at end of file +rustecal-core = { version = "0.1.0", path = "../rustecal-core" } +rustecal-pubsub = { version = "0.1.0", path = "../rustecal-pubsub" } diff --git a/rustecal-types-serde/README.md b/rustecal-types-serde/README.md new file mode 100644 index 0000000..bcd5f3d --- /dev/null +++ b/rustecal-types-serde/README.md @@ -0,0 +1,99 @@ +# rustecal-types-serde + +`rustecal-types-serde` provides Serde-based message wrappers for JSON, CBOR, and MessagePack to use with the typed eCAL Pub/Sub API. + +## Features + +- **JsonMessage**, **CborMessage**, **MsgpackMessage**: per-format wrappers +- Implements `PublisherMessage` and `SubscriberMessage` for seamless integration +- Zero-copy payloads via `Arc` +- Minimal dependencies: `serde`, `serde_json`, `serde_cbor`, `rmp-serde`, `rustecal-core`, `rustecal-pubsub` + +## Installation + +Add to your **workspace** `Cargo.toml`: + +```toml +[dependencies] +rustecal-types-serde = "0.1" +``` + +## Usage + +### Publisher Example (JSON) + +```rust +use std::sync::Arc; +use serde::{Serialize, Deserialize}; +use rustecal::{Ecal, EcalComponents, TypedPublisher}; +use rustecal_types_serde::JsonMessage; + +#[derive(Serialize, Deserialize, Clone, Debug)] +struct MyData { + msg: String, +} + +fn main() -> Result<(), Box> { + Ecal::initialize(Some("json publisher"), EcalComponents::DEFAULT)?; + + let publisher = TypedPublisher::>::new("hello_json")?; + + while Ecal::ok() { + let payload = MyData { msg: "Hello from Rust".into() }; + let message = JsonMessage::new(payload); + publisher.send(&message); + + std::thread::sleep(std::time::Duration::from_millis(500)); + } + + Ecal::finalize(); + Ok(()) +} +``` + +### Subscriber Example (JSON) + +```rust +use std::sync::Arc; +use serde::{Serialize, Deserialize}; +use rustecal::{Ecal, EcalComponents, TypedSubscriber}; +use rustecal_types_serde::JsonMessage; + +#[derive(Serialize, Deserialize, Clone, Debug)] +struct MyData { + msg: String, +} + +fn main() -> Result<(), Box> { + Ecal::initialize(Some("json subscriber"), EcalComponents::DEFAULT)?; + + let mut subscriber = TypedSubscriber::>::new("hello_json")?; + subscriber.set_callback(|message| { + println!("Received: {}", message.payload.data.msg); + }); + + while Ecal::ok() { + std::thread::sleep(std::time::Duration::from_millis(500)); + } + + Ecal::finalize(); + Ok(()) +} +``` + +## Traits Reference + +- **`PublisherMessage`** + - `datatype() -> DataTypeInfo` + - `to_bytes(&self) -> Arc<[u8]>` + +- **`SubscriberMessage`** + - `datatype() -> DataTypeInfo` + - `from_bytes(bytes: Arc<[u8]>, _info: &DataTypeInfo) -> Option` + +## See Also + +- `rustecal-types-bytes` for raw binary data messages +- `rustecal-types-protobuf` for Protobuf-based messages +- `rustecal-types-string` for UTF-8 string messages +- Examples in the `rustecal-samples/pubsub` directory