use axum::{http::StatusCode, response::IntoResponse};
use crate::localsend_lib::{error::Error, receive::ReceiveError, send::SendError};
impl Error {
fn status_code(&self) -> StatusCode {
match self {
Error::Receive(e) => e.into(),
Error::Send(e) => e.into(),
_ => StatusCode::INTERNAL_SERVER_ERROR, }
}
}
impl From<&ReceiveError> for StatusCode {
fn from(value: &ReceiveError) -> Self {
match value {
ReceiveError::Cancelled => StatusCode::OK, ReceiveError::EmptyFiles => StatusCode::BAD_REQUEST, ReceiveError::InvalidIp(_) => StatusCode::FORBIDDEN, ReceiveError::InvalidParameters => StatusCode::BAD_REQUEST, ReceiveError::InvalidRecipient => StatusCode::CONFLICT, ReceiveError::InvalidServerState => StatusCode::INTERNAL_SERVER_ERROR, ReceiveError::InvalidSessionId => StatusCode::FORBIDDEN, ReceiveError::InvalidToken => StatusCode::FORBIDDEN, ReceiveError::NothingSelected => StatusCode::NO_CONTENT, ReceiveError::SaveFileFailed => StatusCode::INTERNAL_SERVER_ERROR, ReceiveError::SessionBlocked => StatusCode::CONFLICT, ReceiveError::SessionDeclined => StatusCode::FORBIDDEN, ReceiveError::SessionNotExists => StatusCode::CONFLICT, }
}
}
impl From<&SendError> for StatusCode {
fn from(value: &SendError) -> Self {
match value {
SendError::NoPermission => StatusCode::FORBIDDEN, _ => StatusCode::INTERNAL_SERVER_ERROR, }
}
}
impl IntoResponse for Error {
fn into_response(self) -> axum::response::Response {
let status_code = self.status_code();
let message = if let StatusCode::INTERNAL_SERVER_ERROR = status_code { "Internal server error".to_owned() } else { self.to_string() };
(status_code, message).into_response()
}
}