#![cfg_attr(not(feature = "std"), no_std)]
#![warn(missing_docs)]
#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::{format, string::String, vec::Vec};
pub mod entities;
pub mod events;
pub mod value_objects;
pub use entities::{Frame, Stream};
pub use events::{DomainEvent, SessionState};
pub use value_objects::{JsonData, JsonPath, Priority, Schema, SessionId, StreamId};
pub type DomainResult<T> = Result<T, DomainError>;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum DomainError {
#[error("Invalid state transition: {0}")]
InvalidStateTransition(String),
#[error("Invalid stream state: {0}")]
InvalidStreamState(String),
#[error("Invalid session state: {0}")]
InvalidSessionState(String),
#[error("Invalid frame: {0}")]
InvalidFrame(String),
#[error("Stream invariant violation: {0}")]
InvariantViolation(String),
#[error("Invalid priority value: {0}")]
InvalidPriority(String),
#[error("Invalid JSON path: {0}")]
InvalidPath(String),
#[error("Session not found: {0}")]
SessionNotFound(String),
#[error("Stream not found: {0}")]
StreamNotFound(String),
#[error("Too many streams: {0}")]
TooManyStreams(String),
#[error("Domain logic error: {0}")]
Logic(String),
#[error("I/O error: {0}")]
Io(String),
#[error("Resource not found: {0}")]
NotFound(String),
#[error("Concurrency conflict: {0}")]
ConcurrencyConflict(String),
#[error("Compression error: {0}")]
CompressionError(String),
#[error("Validation error: {0}")]
ValidationError(String),
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("Internal error: {0}")]
InternalError(String),
#[error("Security violation: {0}")]
SecurityViolation(String),
#[error("Resource exhausted: {0}")]
ResourceExhausted(String),
}
impl DomainError {
pub fn invariant_violation(message: impl Into<String>) -> Self {
Self::InvariantViolation(message.into())
}
pub fn invalid_transition(from: &str, to: &str) -> Self {
Self::InvalidStateTransition(format!("{from} -> {to}"))
}
}
impl From<String> for DomainError {
fn from(error: String) -> Self {
Self::Logic(error)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_domain_error_creation() {
let err = DomainError::invariant_violation("test");
assert!(matches!(err, DomainError::InvariantViolation(_)));
let err = DomainError::invalid_transition("StateA", "StateB");
assert!(matches!(err, DomainError::InvalidStateTransition(_)));
}
#[test]
fn test_domain_result() {
let result: DomainResult<u32> = Ok(42);
assert!(result.is_ok());
let result: DomainResult<u32> = Err(DomainError::Logic("test".to_string()));
assert!(result.is_err());
}
}