schema-sync 1.0.0

Production-grade schema synchronization for multi-tenant databases
Documentation
//! Developer: s4gor
//! Github: https://github.com/s4gor
//!
//! Error types for schema-sync
//!
//! All errors are structured to provide context about what operation failed
//! and why, while maintaining tenant isolation information.

use thiserror::Error;

/// Result type alias for schema-sync operations
pub type Result<T> = std::result::Result<T, Error>;

/// Main error type for schema-sync
#[derive(Error, Debug)]
pub enum Error {
    /// Database connection or query errors
    #[error("Database error: {0}")]
    Database(String),

    /// Schema inspection errors
    #[error("Schema inspection error: {0}")]
    Inspection(String),

    /// Migration execution errors
    #[error("Migration error: {0}")]
    Migration(String),

    /// Tenant-related errors (isolation violations, missing tenant, etc.)
    #[error("Tenant error: {0}")]
    Tenant(String),

    /// Planning errors (invalid plan, conflicts, etc.)
    #[error("Planning error: {0}")]
    Planning(String),

    /// Execution errors (lock failures, rollback issues, etc.)
    #[error("Execution error: {0}")]
    Execution(String),

    /// Snapshot errors (serialization, storage, etc.)
    #[error("Snapshot error: {0}")]
    Snapshot(String),

    /// Diff calculation errors
    #[error("Diff error: {0}")]
    Diff(String),

    /// Validation errors (CI mode failures)
    #[error("Validation error: {0}")]
    Validation(String),

    /// IO errors
    #[error("IO error: {0}")]
    Io(#[from] std::io::Error),

    /// Serialization errors
    #[error("Serialization error: {0}")]
    Serialization(#[from] serde_json::Error),
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_error_display() {
        let err = Error::Database("Connection failed".to_string());
        assert!(err.to_string().contains("Connection failed"));
    }

    #[test]
    fn test_error_from_io() {
        let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "File not found");
        let err: Error = io_err.into();
        assert!(err.to_string().contains("File not found"));
    }
}