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 value_objects;
34
35pub use entities::{Frame, Stream};
37pub use events::{DomainEvent, SessionState};
38pub use value_objects::{JsonData, JsonPath, Priority, Schema, SessionId, StreamId};
39
40pub type DomainResult<T> = Result<T, DomainError>;
42
43#[derive(Debug, thiserror::Error)]
48#[non_exhaustive]
49pub enum DomainError {
50 #[error("Invalid state transition: {0}")]
52 InvalidStateTransition(String),
53
54 #[error("Invalid stream state: {0}")]
56 InvalidStreamState(String),
57
58 #[error("Invalid session state: {0}")]
60 InvalidSessionState(String),
61
62 #[error("Invalid frame: {0}")]
64 InvalidFrame(String),
65
66 #[error("Stream invariant violation: {0}")]
68 InvariantViolation(String),
69
70 #[error("Invalid priority value: {0}")]
72 InvalidPriority(String),
73
74 #[error("Invalid JSON path: {0}")]
76 InvalidPath(String),
77
78 #[error("Session not found: {0}")]
80 SessionNotFound(String),
81
82 #[error("Stream not found: {0}")]
84 StreamNotFound(String),
85
86 #[error("Too many streams: {0}")]
88 TooManyStreams(String),
89
90 #[error("Domain logic error: {0}")]
92 Logic(String),
93
94 #[error("I/O error: {0}")]
96 Io(String),
97
98 #[error("Resource not found: {0}")]
100 NotFound(String),
101
102 #[error("Concurrency conflict: {0}")]
104 ConcurrencyConflict(String),
105
106 #[error("Compression error: {0}")]
108 CompressionError(String),
109
110 #[error("Validation error: {0}")]
112 ValidationError(String),
113
114 #[error("Invalid input: {0}")]
116 InvalidInput(String),
117
118 #[error("Internal error: {0}")]
120 InternalError(String),
121
122 #[error("Security violation: {0}")]
124 SecurityViolation(String),
125
126 #[error("Resource exhausted: {0}")]
128 ResourceExhausted(String),
129}
130
131impl DomainError {
132 pub fn invariant_violation(message: impl Into<String>) -> Self {
134 Self::InvariantViolation(message.into())
135 }
136
137 pub fn invalid_transition(from: &str, to: &str) -> Self {
139 Self::InvalidStateTransition(format!("{from} -> {to}"))
140 }
141}
142
143impl From<String> for DomainError {
144 fn from(error: String) -> Self {
145 Self::Logic(error)
146 }
147}
148
149#[cfg(test)]
150mod tests {
151 use super::*;
152
153 #[test]
154 fn test_domain_error_creation() {
155 let err = DomainError::invariant_violation("test");
156 assert!(matches!(err, DomainError::InvariantViolation(_)));
157
158 let err = DomainError::invalid_transition("StateA", "StateB");
159 assert!(matches!(err, DomainError::InvalidStateTransition(_)));
160 }
161
162 #[test]
163 fn test_domain_result() {
164 let result: DomainResult<u32> = Ok(42);
165 assert!(result.is_ok());
166
167 let result: DomainResult<u32> = Err(DomainError::Logic("test".to_string()));
168 assert!(result.is_err());
169 }
170}