1#![cfg_attr(not(feature = "std"), no_std)]
23#![warn(missing_docs)]
24
25#[cfg(not(feature = "std"))]
26extern crate alloc;
27
28#[cfg(not(feature = "std"))]
29use alloc::{format, string::String, vec::Vec};
30
31pub mod entities;
32pub mod events;
33pub mod services;
34pub mod value_objects;
35
36pub use entities::{Frame, Stream};
38pub use events::{DomainEvent, SessionState};
39pub use services::{PriorityHeuristicConfig, compute_priority};
40pub use value_objects::{JsonData, JsonPath, Priority, Schema, SessionId, StreamId};
41
42pub type DomainResult<T> = Result<T, DomainError>;
44
45#[derive(Debug, thiserror::Error)]
50#[non_exhaustive]
51pub enum DomainError {
52 #[error("Invalid state transition: {0}")]
54 InvalidStateTransition(String),
55
56 #[error("Invalid stream state: {0}")]
58 InvalidStreamState(String),
59
60 #[error("Invalid session state: {0}")]
62 InvalidSessionState(String),
63
64 #[error("Invalid frame: {0}")]
66 InvalidFrame(String),
67
68 #[error("Stream invariant violation: {0}")]
70 InvariantViolation(String),
71
72 #[error("Invalid priority value: {0}")]
74 InvalidPriority(String),
75
76 #[error("Invalid JSON path: {0}")]
78 InvalidPath(String),
79
80 #[error("Session not found: {0}")]
82 SessionNotFound(String),
83
84 #[error("Stream not found: {0}")]
86 StreamNotFound(String),
87
88 #[error("Too many streams: {0}")]
90 TooManyStreams(String),
91
92 #[error("Domain logic error: {0}")]
94 Logic(String),
95
96 #[error("I/O error: {0}")]
98 Io(String),
99
100 #[error("Resource not found: {0}")]
102 NotFound(String),
103
104 #[error("Concurrency conflict: {0}")]
106 ConcurrencyConflict(String),
107
108 #[error("Compression error: {0}")]
110 CompressionError(String),
111
112 #[error("Validation error: {0}")]
114 ValidationError(String),
115
116 #[error("Invalid input: {0}")]
118 InvalidInput(String),
119
120 #[error("Internal error: {0}")]
122 InternalError(String),
123
124 #[error("Security violation: {0}")]
126 SecurityViolation(String),
127
128 #[error("Resource exhausted: {0}")]
130 ResourceExhausted(String),
131}
132
133impl DomainError {
134 pub fn invariant_violation(message: impl Into<String>) -> Self {
136 Self::InvariantViolation(message.into())
137 }
138
139 pub fn invalid_transition(from: &str, to: &str) -> Self {
141 Self::InvalidStateTransition(format!("{from} -> {to}"))
142 }
143}
144
145impl From<String> for DomainError {
146 fn from(error: String) -> Self {
147 Self::Logic(error)
148 }
149}
150
151#[cfg(test)]
152mod tests {
153 use super::*;
154
155 #[test]
156 fn test_domain_error_creation() {
157 let err = DomainError::invariant_violation("test");
158 assert!(matches!(err, DomainError::InvariantViolation(_)));
159
160 let err = DomainError::invalid_transition("StateA", "StateB");
161 assert!(matches!(err, DomainError::InvalidStateTransition(_)));
162 }
163
164 #[test]
165 fn test_domain_result() {
166 let result: DomainResult<u32> = Ok(42);
167 assert!(result.is_ok());
168
169 let result: DomainResult<u32> = Err(DomainError::Logic("test".to_string()));
170 assert!(result.is_err());
171 }
172}