pjson_rs/domain/
mod.rs

1//! Domain layer - Pure business logic
2//!
3//! Contains entities, value objects, aggregates, domain services
4//! and domain events. No dependencies on infrastructure concerns.
5
6pub mod aggregates;
7pub mod entities;
8pub mod events;
9pub mod ports;
10pub mod services;
11pub mod value_objects;
12
13// Re-export core domain types
14pub 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
21/// Domain Result type
22pub type DomainResult<T> = Result<T, DomainError>;
23
24/// Domain-specific errors
25#[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}