cf-file-parser 0.1.21

File Parser module
Documentation
use http::StatusCode;
use modkit::api::problem::Problem;

use crate::domain::error::DomainError;

/// Convert domain errors to HTTP Problem responses
pub fn domain_error_to_problem(err: DomainError) -> Problem {
    match err {
        DomainError::FileNotFound { path } => Problem::new(
            StatusCode::NOT_FOUND,
            "File Not Found",
            format!("File not found: {path}"),
        ),

        DomainError::UnsupportedFileType { extension } => Problem::new(
            StatusCode::BAD_REQUEST,
            "Unsupported File Type",
            format!("Unsupported file type: {extension}"),
        ),

        DomainError::NoParserAvailable { extension } => Problem::new(
            StatusCode::UNSUPPORTED_MEDIA_TYPE,
            "No Parser Available",
            format!("No parser available for extension: {extension}"),
        ),

        DomainError::ParseError { message } => {
            Problem::new(StatusCode::UNPROCESSABLE_ENTITY, "Parse Error", message)
        }

        DomainError::IoError { message } => {
            Problem::new(StatusCode::INTERNAL_SERVER_ERROR, "IO Error", message)
        }

        DomainError::InvalidRequest { message } => {
            Problem::new(StatusCode::BAD_REQUEST, "Invalid Request", message)
        }

        DomainError::PathTraversalBlocked { message } => {
            Problem::new(StatusCode::FORBIDDEN, "Path Traversal Blocked", message)
        }
    }
}

/// Implement Into<Problem> for `DomainError` so `?` works in handlers
impl From<DomainError> for Problem {
    fn from(e: DomainError) -> Self {
        domain_error_to_problem(e)
    }
}