1pub mod aggregates;
7pub mod entities;
8pub mod events;
9pub mod ports;
10pub mod services;
11pub mod value_objects;
12
13pub use aggregates::StreamSession;
15pub use entities::{Frame, Stream};
16pub use events::DomainEvent;
17pub use ports::{FrameSink, FrameSource, StreamRepository};
18pub use services::PriorityService;
19pub use value_objects::{JsonPath, Priority, SessionId, StreamId};
20
21pub type DomainResult<T> = Result<T, DomainError>;
23
24#[derive(Debug, thiserror::Error)]
26pub enum DomainError {
27 #[error("Invalid state transition: {0}")]
28 InvalidStateTransition(String),
29
30 #[error("Invalid stream state: {0}")]
31 InvalidStreamState(String),
32
33 #[error("Invalid session state: {0}")]
34 InvalidSessionState(String),
35
36 #[error("Invalid frame: {0}")]
37 InvalidFrame(String),
38
39 #[error("Stream invariant violation: {0}")]
40 InvariantViolation(String),
41
42 #[error("Invalid priority value: {0}")]
43 InvalidPriority(String),
44
45 #[error("Invalid JSON path: {0}")]
46 InvalidPath(String),
47
48 #[error("Session not found: {0}")]
49 SessionNotFound(String),
50
51 #[error("Stream not found: {0}")]
52 StreamNotFound(String),
53
54 #[error("Too many streams: {0}")]
55 TooManyStreams(String),
56
57 #[error("Domain logic error: {0}")]
58 Logic(String),
59
60 #[error("I/O error: {0}")]
61 Io(String),
62
63 #[error("Resource not found: {0}")]
64 NotFound(String),
65
66 #[error("Concurrency conflict: {0}")]
67 ConcurrencyConflict(String),
68
69 #[error("Compression error: {0}")]
70 CompressionError(String),
71
72 #[error("Validation error: {0}")]
73 ValidationError(String),
74
75 #[error("Invalid input: {0}")]
76 InvalidInput(String),
77
78 #[error("Internal error: {0}")]
79 InternalError(String),
80}
81
82impl DomainError {
83 pub fn invariant_violation(message: impl Into<String>) -> Self {
84 Self::InvariantViolation(message.into())
85 }
86
87 pub fn invalid_transition(from: &str, to: &str) -> Self {
88 Self::InvalidStateTransition(format!("{from} -> {to}"))
89 }
90}
91
92impl From<String> for DomainError {
93 fn from(error: String) -> Self {
94 Self::Logic(error)
95 }
96}