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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
// Abstract Service Definition Module
//!
//! This module defines the core AbstractService trait that all services must implement,
//! along with its associated types and enumerations. It establishes the foundation
//! for service implementation, lifecycle management, and communication patterns.
//!
//! # Architectural Principles
//! 1. Interface-First Design - All services must implement a consistent interface
//! 2. Lifecycle Management - Services follow a predictable lifecycle (init, start, stop)
//! 3. Consistent Communication - All services use the same request/response patterns
//! 4. Self-Describing Services - Services provide metadata about their capabilities
//! 5. Asynchronous Operations - All service methods are async for performance
use Result;
use ;
use fmt;
use crateLifecycleContext;
use Plain;
/// Represents the current lifecycle state of a service.
///
/// This enum tracks the lifecycle stage of a service to ensure proper
/// initialization and operational management. The state transitions
/// follow a predictable pattern: Created → Initialized → Running → Stopped.
///
/// # State Transitions
///
/// The service lifecycle follows this pattern:
/// - Created -> Initialized -> Running -> Stopped
/// - Error states can occur at any stage
///
/// # Examples
///
/// ```rust
/// use runar_node::services::abstract_service::ServiceState;
///
/// // Check if a service is ready to handle requests
/// let service_state = ServiceState::Running;
/// if service_state == ServiceState::Running {
/// // Service is operational
/// }
///
/// // Check if a service needs to be started
/// let service_state = ServiceState::Initialized;
/// if service_state == ServiceState::Initialized {
/// // Service is ready to start
/// }
/// ```
/// Abstract service interface that all services must implement.
///
/// This trait defines a common interface for all services, enabling uniform
/// management of service lifecycle and request handling. It establishes the
/// foundation for the service architecture and ensures consistent behavior
/// across all service implementations.
///
/// # Architectural Principles
///
/// - **Consistent Lifecycle**: All services follow the same init/start/stop pattern
/// - **Resource Management**: Proper resource allocation and cleanup
/// - **Predictable State**: Well-defined state transitions
/// - **Async Operations**: All lifecycle methods are asynchronous
/// - **Self-Describing**: Services provide metadata about their capabilities
///
/// # Lifecycle Methods
///
/// 1. **`init`**: Set up the service for operation
/// 2. **`start`**: Begin active operations
/// 3. **`stop`**: Gracefully shut down the service
///
/// # Examples
///
/// ```rust
/// use runar_node::services::{abstract_service::AbstractService, LifecycleContext};
/// use anyhow::Result;
/// use async_trait::async_trait;
///
/// #[derive(Clone)]
/// pub struct MyService {
/// name: String,
/// path: String,
/// }
///
/// #[async_trait]
/// impl AbstractService for MyService {
/// fn name(&self) -> &str { &self.name }
/// fn version(&self) -> &str { "1.0.0" }
/// fn path(&self) -> &str { &self.path }
/// fn description(&self) -> &str { "My example service" }
/// fn network_id(&self) -> Option<String> { None }
/// fn set_network_id(&mut self, network_id: String) { /* implementation */ }
///
/// async fn init(&self, context: LifecycleContext) -> Result<()> {
/// // Register action handlers, set up connections, etc.
/// Ok(())
/// }
///
/// async fn start(&self, context: LifecycleContext) -> Result<()> {
/// // Start background tasks, timers, etc.
/// Ok(())
/// }
///
/// async fn stop(&self, context: LifecycleContext) -> Result<()> {
/// // Clean up resources, cancel tasks, etc.
/// Ok(())
/// }
/// }
/// ```
///
/// # Thread Safety
///
/// All services must be `Send + Sync` to ensure they can be safely shared
/// across multiple threads and async tasks.