citadel_sdk/
macros.rs

1//! Procedural Macros for Citadel SDK
2//!
3//! This module provides macro utilities that simplify the implementation of common
4//! traits and patterns in the Citadel Protocol SDK. These macros reduce boilerplate
5//! code and ensure consistent implementations.
6//!
7//! # Features
8//! - Automatic trait implementation generation
9//! - Support for async/await patterns
10//! - Integration with protocol communication systems
11//!
12//! # Example
13//! ```rust
14//! use citadel_sdk::prelude::*;
15//! use citadel_sdk::impl_remote;
16//!
17//! #[derive(Clone)]
18//! struct MyRemote<R: Ratchet> {
19//!     inner: NodeRemote<R>,
20//! }
21//!
22//! impl_remote!(MyRemote);
23//! ```
24//!
25//! # Important Notes
26//! - Macros are used internally by the SDK
27//! - Custom implementations should match the behavior of macro-generated code
28//! - Async trait implementations require the async-trait feature
29//!
30//! # Related Components
31//! - [`Remote`]: Core trait for network communication
32//! - [`AccountManager`]: User account management
33//! - [`NodeRequest`]: Network request handling
34//!
35
36#[macro_export]
37macro_rules! impl_remote {
38    ($item:ident) => {
39        #[$crate::async_trait]
40        impl<R: $crate::prelude::Ratchet> Remote<R> for $item<R> {
41            async fn send_with_custom_ticket(
42                &self,
43                ticket: Ticket,
44                request: NodeRequest,
45            ) -> Result<(), NetworkError> {
46                self.inner.send_with_custom_ticket(ticket, request).await
47            }
48
49            async fn send_callback_subscription(
50                &self,
51                request: NodeRequest,
52            ) -> Result<
53                citadel_proto::kernel::kernel_communicator::KernelStreamSubscription<R>,
54                NetworkError,
55            > {
56                self.inner.send_callback_subscription(request).await
57            }
58
59            fn account_manager(&self) -> &AccountManager<R, R> {
60                self.inner.account_manager()
61            }
62
63            fn get_next_ticket(&self) -> Ticket {
64                self.inner.get_next_ticket()
65            }
66        }
67    };
68}