Skip to main content

plexus_substrate/activations/echo/
activation.rs

1//! Echo activation - demonstrates hub-macro usage with caller-wraps streaming
2//!
3//! This is a minimal example showing how to create an activation using the
4//! `#[hub_methods]` macro. The macro generates:
5//!
6//! - RPC trait and server implementation
7//! - Activation trait implementation
8//! - Method enum with JSON schemas
9//!
10//! Event types are plain domain types (no special traits needed).
11//! The macro handles wrapping with `wrap_stream()` at the call site.
12
13use super::types::EchoEvent;
14use async_stream::stream;
15use futures::Stream;
16use std::time::Duration;
17
18/// Echo activation - echoes messages back
19#[derive(Clone)]
20pub struct Echo;
21
22impl Echo {
23    pub fn new() -> Self {
24        Echo
25    }
26}
27
28impl Default for Echo {
29    fn default() -> Self {
30        Self::new()
31    }
32}
33
34/// Hub-macro generates all the boilerplate for this impl block:
35/// - EchoRpc trait with JSON-RPC subscription methods
36/// - EchoRpcServer implementation
37/// - Activation trait implementation
38/// - EchoMethod enum with JSON schemas
39#[plexus_macros::activation(namespace = "echo",
40version = "1.0.0",
41description = "Echo messages back - demonstrates plexus-macros usage", crate_path = "plexus_core")]
42impl Echo {
43    /// Echo a message back
44    #[plexus_macros::method(description = "Echo a message back the specified number of times",
45    params(
46        message = "The message to echo",
47        count = "Number of times to repeat (default: 1)"
48    ))]
49    async fn echo(
50        &self,
51        message: String,
52        count: u32,
53    ) -> impl Stream<Item = EchoEvent> + Send + 'static {
54        let count = if count == 0 { 1 } else { count };
55        stream! {
56            for i in 0..count {
57                if i > 0 {
58                    tokio::time::sleep(Duration::from_millis(500)).await;
59                }
60                yield EchoEvent::Echo {
61                    message: message.clone(),
62                    count: i + 1,
63                };
64            }
65        }
66    }
67
68    /// Echo a simple message once
69    #[plexus_macros::method(description = "Echo a message once",
70    params(message = "The message to echo"))]
71    async fn once(&self, message: String) -> impl Stream<Item = EchoEvent> + Send + 'static {
72        stream! {
73            yield EchoEvent::Echo {
74                message,
75                count: 1,
76            };
77        }
78    }
79
80    /// Ping — returns a Pong response
81    #[plexus_macros::method(description = "Ping — returns a Pong response")]
82    async fn ping(&self) -> impl Stream<Item = EchoEvent> + Send + 'static {
83        stream! {
84            yield EchoEvent::Pong;
85        }
86    }
87}