use std::fmt;
pub type ModelResult<T> = Result<T, ModelError>;
#[derive(Debug, Clone)]
pub enum ModelError {
Database(String),
NotFound(String),
Validation(String),
MissingPrimaryKey,
Relationship(String),
Serialization(String),
Migration(String),
Connection(String),
Transaction(String),
Schema(String),
Query(String),
Event(String),
}
impl fmt::Display for ModelError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ModelError::Database(msg) => write!(f, "Database error: {}", msg),
ModelError::NotFound(table) => write!(f, "Record not found in table '{}'", table),
ModelError::Validation(msg) => write!(f, "Validation error: {}", msg),
ModelError::MissingPrimaryKey => write!(f, "Primary key is missing or invalid"),
ModelError::Relationship(msg) => write!(f, "Relationship error: {}", msg),
ModelError::Serialization(msg) => write!(f, "Serialization error: {}", msg),
ModelError::Migration(msg) => write!(f, "Migration error: {}", msg),
ModelError::Connection(msg) => write!(f, "Connection error: {}", msg),
ModelError::Transaction(msg) => write!(f, "Transaction error: {}", msg),
ModelError::Schema(msg) => write!(f, "Schema error: {}", msg),
ModelError::Query(msg) => write!(f, "Query error: {}", msg),
ModelError::Event(msg) => write!(f, "Event error: {}", msg),
}
}
}
impl std::error::Error for ModelError {}
impl From<sqlx::Error> for ModelError {
fn from(err: sqlx::Error) -> Self {
ModelError::Database(err.to_string())
}
}
impl From<serde_json::Error> for ModelError {
fn from(err: serde_json::Error) -> Self {
ModelError::Serialization(err.to_string())
}
}
impl From<anyhow::Error> for ModelError {
fn from(err: anyhow::Error) -> Self {
ModelError::Database(err.to_string())
}
}
#[derive(Debug, Clone)]
pub enum QueryError {
InvalidSql(String),
MissingFields(String),
InvalidParameter(String),
UnsupportedOperation(String),
}
impl fmt::Display for QueryError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
QueryError::InvalidSql(msg) => write!(f, "Invalid SQL: {}", msg),
QueryError::MissingFields(msg) => write!(f, "Missing fields: {}", msg),
QueryError::InvalidParameter(msg) => write!(f, "Invalid parameter: {}", msg),
QueryError::UnsupportedOperation(msg) => write!(f, "Unsupported operation: {}", msg),
}
}
}
impl std::error::Error for QueryError {}
impl From<QueryError> for ModelError {
fn from(err: QueryError) -> Self {
ModelError::Query(err.to_string())
}
}
#[derive(Debug, Clone)]
pub enum RelationshipError {
NotFound(String),
InvalidConfiguration(String),
CircularDependency(String),
ForeignKeyViolation(String),
}
impl fmt::Display for RelationshipError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RelationshipError::NotFound(msg) => write!(f, "Relationship not found: {}", msg),
RelationshipError::InvalidConfiguration(msg) => write!(f, "Invalid relationship configuration: {}", msg),
RelationshipError::CircularDependency(msg) => write!(f, "Circular dependency: {}", msg),
RelationshipError::ForeignKeyViolation(msg) => write!(f, "Foreign key violation: {}", msg),
}
}
}
impl std::error::Error for RelationshipError {}
impl From<RelationshipError> for ModelError {
fn from(err: RelationshipError) -> Self {
ModelError::Relationship(err.to_string())
}
}
#[derive(Debug, Clone)]
pub enum MigrationError {
FileNotFound(String),
InvalidSyntax(String),
AlreadyApplied(String),
RollbackFailed(String),
VersionConflict(String),
}
impl fmt::Display for MigrationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MigrationError::FileNotFound(msg) => write!(f, "Migration file not found: {}", msg),
MigrationError::InvalidSyntax(msg) => write!(f, "Invalid migration syntax: {}", msg),
MigrationError::AlreadyApplied(msg) => write!(f, "Migration already applied: {}", msg),
MigrationError::RollbackFailed(msg) => write!(f, "Migration rollback failed: {}", msg),
MigrationError::VersionConflict(msg) => write!(f, "Version conflict: {}", msg),
}
}
}
impl std::error::Error for MigrationError {}
impl From<MigrationError> for ModelError {
fn from(err: MigrationError) -> Self {
ModelError::Migration(err.to_string())
}
}
#[derive(Debug, Clone)]
pub enum EventError {
HandlerFailed(String),
PropagationStopped(String),
InvalidConfiguration(String),
}
impl fmt::Display for EventError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
EventError::HandlerFailed(msg) => write!(f, "Event handler failed: {}", msg),
EventError::PropagationStopped(msg) => write!(f, "Event propagation stopped: {}", msg),
EventError::InvalidConfiguration(msg) => write!(f, "Invalid event configuration: {}", msg),
}
}
}
impl std::error::Error for EventError {}
impl From<EventError> for ModelError {
fn from(err: EventError) -> Self {
ModelError::Event(err.to_string())
}
}