Skip to main content

room_dds_bridge/
lib.rs

1//! # room-dds-bridge
2//!
3//! Auto-configure DDS (Data Distribution Service) domains from ternary-mud room topology.
4//!
5//! Each room becomes a DDS topic, passages become domain bridges, and the ternary
6//! {-1, 0, +1} state drives QoS policies.
7
8pub mod bridge_config;
9pub mod domain_map;
10pub mod pub_sub;
11pub mod qos_policy;
12pub mod room_config;
13pub mod topic_gen;
14
15use serde::{Deserialize, Serialize};
16
17// ── Core enums ──────────────────────────────────────────────────────────────
18
19/// DDS reliability policy.
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21pub enum Reliability {
22    Reliable,
23    BestEffort,
24}
25
26/// DDS durability policy.
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
28pub enum Durability {
29    Volatile,
30    TransientLocal,
31    Persistent,
32}
33
34/// DDS history kind.
35#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
36pub enum HistoryKind {
37    KeepLast(usize),
38    KeepAll,
39}
40
41/// Ternary state from the mud engine.
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
43pub enum Ternary {
44    Neg = -1,
45    Zero = 0,
46    Pos = 1,
47}
48
49// ── Core structs ────────────────────────────────────────────────────────────
50
51/// Full QoS policy derived from ternary state.
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub struct QoSPolicy {
54    pub reliability: Reliability,
55    pub durability: Durability,
56    pub history: HistoryKind,
57    pub depth: usize,
58}
59
60/// Per-room DDS configuration.
61#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
62pub struct RoomConfig {
63    pub room_id: String,
64    pub topic: String,
65    pub domain_id: u32,
66    pub history_depth: usize,
67}
68
69/// A single DDS domain containing one or more rooms.
70#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
71pub struct Domain {
72    pub id: u32,
73    pub rooms: Vec<String>,
74}
75
76/// A bridge connecting two domains for specific rooms.
77#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
78pub struct DomainBridge {
79    pub from_domain: u32,
80    pub to_domain: u32,
81    pub rooms: Vec<String>,
82}
83
84/// Full domain mapping: domains and inter-domain bridges.
85#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
86pub struct DomainMap {
87    pub domains: Vec<Domain>,
88    pub bridges: Vec<DomainBridge>,
89}
90
91/// A DDS topic definition generated from a room schema.
92#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
93pub struct TopicDef {
94    pub name: String,
95    pub type_name: String,
96    pub key_fields: Vec<String>,
97}
98
99/// Complete DDS configuration, serializable to JSON.
100#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
101pub struct DDSConfig {
102    pub rooms: Vec<RoomConfig>,
103    pub domains: DomainMap,
104    pub topics: Vec<TopicDef>,
105}
106
107/// A room in the mud topology.
108#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
109pub struct Room {
110    pub id: String,
111    pub name: String,
112    pub agent_count: usize,
113    pub schema: RoomSchema,
114}
115
116/// Room data schema for topic generation.
117#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
118pub struct RoomSchema {
119    pub fields: Vec<FieldDef>,
120}
121
122/// A field in a room schema.
123#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
124pub struct FieldDef {
125    pub name: String,
126    pub type_name: String,
127    pub is_key: bool,
128}
129
130/// A passage connecting two rooms.
131#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
132pub struct Passage {
133    pub from: String,
134    pub to: String,
135    pub ternary: Ternary,
136}
137
138/// An agent in the system.
139#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
140pub struct Agent {
141    pub id: String,
142    pub room_id: String,
143    pub publishes: bool,
144    pub subscribes: bool,
145}
146
147/// Publisher/subscriber assignment for a room.
148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
149pub struct PubSubAssignment {
150    pub room_id: String,
151    pub publishers: Vec<String>,
152    pub subscribers: Vec<String>,
153}
154
155/// Full topology input.
156#[derive(Debug, Clone, Serialize, Deserialize)]
157pub struct Topology {
158    pub rooms: Vec<Room>,
159    pub passages: Vec<Passage>,
160    pub agents: Vec<Agent>,
161}
162
163#[cfg(test)]
164mod tests;