diff --git a/src/stratum-api-s3/src/errors/error.rs b/src/stratum-api-s3/src/errors/error.rs index fb1022b..fdf7ecc 100644 --- a/src/stratum-api-s3/src/errors/error.rs +++ b/src/stratum-api-s3/src/errors/error.rs @@ -1,3 +1,5 @@ +use std::fmt::write; + use axum::{ response::{IntoResponse, Response}, http::StatusCode @@ -29,8 +31,39 @@ pub enum ApiError { impl std::fmt::Display for ApiError { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match Self { + match self { //TODO: Add Api Error messages + ApiError::AuthorizationFailed => write!(f, "AuthorizationFailed"), + ApiError::BucketAlreadyExists => write!(f, "BucketAlreadyExists"), + ApiError::BucketNotFound => write!(f, "BucketNotFound"), + ApiError::InternalError(message) => write!(f, "InternalError: {}", message), + ApiError::InvalidArgument(message) => write!(f, "InvalidArgument: {}", message), + ApiError::InvalidBucketName => write!(f, "InvalidBucketName"), + ApiError::MissingAuthHeader => write!(f, "MissingAuthHeader"), + ApiError::NotImplemented => write!(f, "NotImplemented"), + ApiError::ObjectNotFound => write!(f, "ObjectNotFound") } } +} + +impl ApiError { + fn status_code(&self) -> StatusCode { + match self { + ApiError::BucketNotFound => StatusCode::NOT_FOUND, + ApiError::ObjectNotFound => StatusCode::NOT_FOUND, + ApiError::BucketAlreadyExists => StatusCode::CONFLICT, + ApiError::InvalidArgument(_) => StatusCode::BAD_REQUEST, + ApiError::InvalidBucketName => StatusCode::BAD_REQUEST, + ApiError::AuthorizationFailed => StatusCode::FORBIDDEN, + ApiError::MissingAuthHeader => StatusCode::UNAUTHORIZED, + ApiError::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR, + ApiError::NotImplemented => StatusCode::NOT_IMPLEMENTED, + } + } +} + +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + (self.status_code(), self.to_string()).into_response() + } } \ No newline at end of file