axum-image-endpoint 0.1.1

Image Endpoint to upload big images and receive rescaled ones
Documentation
use std::io;
use std::path::PathBuf;

use axum::http::StatusCode;
use axum::{extract::multipart, response::IntoResponse};
use thiserror::Error;

pub(crate) type Result<T> = std::result::Result<T, ImageEndpointError>;

#[derive(Debug, Error)]
#[error(transparent)]
pub enum ImageEndpointError {
    #[error("Error during Multipart Parsing")]
    MultipartParsing(#[from] multipart::MultipartError),

    #[error("Error during Multipart Parsing")]
    MultipartRejection(#[from] multipart::MultipartRejection),

    #[error("Not all needed fields (folder & file) provided in the file upload")]
    MultipartFieldsMissing,

    #[error("Requested image was not found")]
    ImageNotFound(PathBuf),

    #[error("There is already an image with the same name")]
    ImageAlreadyFound,

    #[error("Was not able to write image to disk")]
    WriteImage(#[from] io::Error),

    #[error("Reading image was not successfull")]
    OpenImage(#[from] image::error::DecodingError),

    #[error("Error while processing image")]
    ProcessingImage(#[from] image::error::ImageError),

    #[error("Error: {0}")]
    Generic(String),
}

impl IntoResponse for ImageEndpointError {
    fn into_response(self) -> axum::response::Response {
        match self {
            ImageEndpointError::MultipartParsing(_) => todo!(),
            ImageEndpointError::MultipartFieldsMissing | ImageEndpointError::ImageAlreadyFound => {
                (StatusCode::BAD_REQUEST, self.to_string()).into_response()
            }
            ImageEndpointError::ImageNotFound(file) => {
                (StatusCode::BAD_REQUEST, file.to_string_lossy().to_string()).into_response()
            }
            ImageEndpointError::WriteImage(_) | ImageEndpointError::Generic(_) => {
                (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response()
            }
            ImageEndpointError::OpenImage(_) => {
                todo!()
            }
            ImageEndpointError::ProcessingImage(_) => todo!(),
            ImageEndpointError::MultipartRejection(_) => todo!(),
        }
    }
}