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!(),
}
}
}