1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//! Example showing explicit protocol imports with feature flags
//!
//! Run with: `cargo run --example protocol_namespaces --features zmq`
//!
//! This demonstrates how feature-gated protocols keep dependencies minimal.
// ============================================================================
// Style 1: Explicit protocol namespace (recommended)
// ============================================================================
async fn _explicit_style() -> Result<(), Box<dyn std::error::Error>> {
use monocoque::zmq::{DealerSocket, RouterSocket};
let dealer = DealerSocket::connect("127.0.0.1:5555").await?;
let (listener, router) = RouterSocket::bind("127.0.0.1:6666").await?;
// Clear what protocol each socket uses
tracing::info!("Created ZMQ DEALER and ROUTER sockets");
drop((dealer, router, listener));
Ok(())
}
// ============================================================================
// Style 2: Protocol prelude (for convenience)
// ============================================================================
async fn _prelude_style() -> Result<(), Box<dyn std::error::Error>> {
use monocoque::zmq::prelude::*;
let dealer = DealerSocket::connect("127.0.0.1:5555").await?;
let (listener, router) = RouterSocket::bind("127.0.0.1:6666").await?;
tracing::info!("Created ZMQ sockets (imported via prelude)");
drop((dealer, router, listener));
Ok(())
}
// ============================================================================
// Future: Multi-protocol mixing (when other protocols are added)
// ============================================================================
async fn _future_multi_protocol() -> Result<(), Box<dyn std::error::Error>> {
// Explicit namespaces prevent conflicts
use monocoque::zmq::DealerSocket as ZmqDealer;
// use monocoque::mqtt::Client as MqttClient; // Future: features = ["mqtt"]
// use monocoque::amqp::Connection as AmqpConn; // Future: features = ["amqp"]
let zmq_socket = ZmqDealer::connect("127.0.0.1:5555").await?;
// let mqtt_client = MqttClient::connect("mqtt://broker:1883").await?;
// let amqp_conn = AmqpConn::connect("amqp://localhost:5672").await?;
tracing::info!("Multiple protocols coexist cleanly!");
drop(zmq_socket);
Ok(())
}
fn main() {
tracing::info!("Example requires 'zmq' feature:");
tracing::info!(" cargo run --example protocol_namespaces --features zmq");
tracing::info!("");
tracing::info!("Import patterns:");
tracing::info!(" - Explicit: use monocoque::zmq::DealerSocket;");
tracing::info!(" - Prelude: use monocoque::zmq::prelude::*;");
}