fraiseql-error 2.0.0-beta.2

Error types for FraiseQL v2
Documentation
#[derive(Debug, thiserror::Error)]
pub enum FileError {
    #[error("File too large: {size} bytes (max: {max} bytes)")]
    TooLarge { size: usize, max: usize },

    #[error("Invalid file type: {got} (allowed: {allowed:?})")]
    InvalidType {
        got:     String,
        allowed: Vec<String>,
    },

    #[error("MIME type mismatch: declared {declared}, detected {detected}")]
    MimeMismatch { declared: String, detected: String },

    #[error("Storage error: {message}")]
    Storage {
        message: String,
        #[source]
        source:  Option<Box<dyn std::error::Error + Send + Sync>>,
    },

    #[error("Processing error: {message}")]
    Processing { message: String },

    #[error("File not found: {id}")]
    NotFound { id: String },

    #[error("Virus detected: {details}")]
    VirusDetected { details: String },

    #[error("Upload quota exceeded")]
    QuotaExceeded,
}

impl FileError {
    pub const fn error_code(&self) -> &'static str {
        match self {
            Self::TooLarge { .. } => "file_too_large",
            Self::InvalidType { .. } => "file_invalid_type",
            Self::MimeMismatch { .. } => "file_mime_mismatch",
            Self::Storage { .. } => "file_storage_error",
            Self::Processing { .. } => "file_processing_error",
            Self::NotFound { .. } => "file_not_found",
            Self::VirusDetected { .. } => "file_virus_detected",
            Self::QuotaExceeded => "file_quota_exceeded",
        }
    }
}