HomeDisk/src/server/error.rs

78 lines
2.1 KiB
Rust

use serde::Serialize;
use thiserror::Error;
use tracing::error;
#[derive(Debug, Clone, Error)]
pub enum Error {
// auth error
#[error("User not found")]
UserNotFound,
#[error("User already exists")]
UserAlreadyExists,
#[error("Failed to generate access token")]
GenerateToken,
#[error("An error occurred in database request")]
Database,
#[error("Username is too short")]
UsernameTooShort,
#[error("Username is too short")]
UsernameTooLong,
#[error("Password is too short")]
PasswordTooShort,
#[error("Invalid token")]
InvalidToken,
#[error("`{0}` header is missing")]
MissingHeader(&'static str),
#[error("`Authorization` header must be a bearer token")]
MissingBearer,
// fs error
#[error("Invalid `path` query parameter")]
InvalidPath,
#[error("Failed to read files from directory")]
FailedReadDirectory,
#[error("Failed to create directory")]
CreateDirectory,
#[error("Failed to create file")]
CreateFile,
#[error("File or directory already exists")]
AlreadyExists,
#[error("File or directory does not exists")]
NotFound,
#[error("Failed to delete directory (directory is not empty?)")]
DeleteDirectory,
#[error("Failed to delete file")]
DeleteFile,
#[error("Multipart error")]
Multipart,
#[error("Write to file failed")]
WriteFile,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "kebab-case")]
enum ResponseError {
Error(String),
}
impl axum::response::IntoResponse for Error {
fn into_response(self) -> axum::response::Response {
use axum::http::StatusCode;
#[cfg(debug_assertions)]
error!("Error: {:?}", self);
let status = match self {
Error::GenerateToken => StatusCode::INTERNAL_SERVER_ERROR,
Error::Database => StatusCode::INTERNAL_SERVER_ERROR,
_ => StatusCode::BAD_REQUEST,
};
let mut response = axum::Json(ResponseError::Error(self.to_string())).into_response();
*response.status_mut() = status;
response
}
}
pub type Result<T, E = Error> = std::result::Result<T, E>;