60 lines
1.8 KiB
Rust
60 lines
1.8 KiB
Rust
use axum::{
|
|
http::StatusCode,
|
|
response::{IntoResponse, Response},
|
|
};
|
|
use log::error;
|
|
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub enum Error {
|
|
#[error("io error: {:?}", 0)]
|
|
Io(#[from] std::io::Error),
|
|
#[error("time error: {:?}", 0)]
|
|
Time(#[from] std::time::SystemTimeError),
|
|
#[error("metadata error: {:?}", 0)]
|
|
MetadataDe(#[from] toml::de::Error),
|
|
#[error("metadata error: {:?}", 0)]
|
|
MetadataSer(#[from] toml::ser::Error),
|
|
#[error("phrase is not valid")]
|
|
PhraseInvalid,
|
|
#[error("bin could not be found")]
|
|
BinNotFound,
|
|
#[error("file exists")]
|
|
DataFileExists,
|
|
|
|
#[error("hex error: {:?}", 0)]
|
|
Hex(#[from] hex::FromHexError),
|
|
|
|
#[error("could not parse ttl")]
|
|
ParseTtl,
|
|
|
|
#[error("encryption error")]
|
|
ChaCha,
|
|
|
|
#[error("oidc redirect")]
|
|
Oidc(Response),
|
|
|
|
#[error("invalid multipart")]
|
|
InvalidMultipart,
|
|
}
|
|
|
|
impl IntoResponse for Error {
|
|
fn into_response(self) -> axum::response::Response {
|
|
match self {
|
|
Self::PhraseInvalid => (StatusCode::BAD_REQUEST, "url is not valid\n").into_response(),
|
|
Self::BinNotFound => (StatusCode::NOT_FOUND, "bin does not exist\n").into_response(),
|
|
Self::DataFileExists => {
|
|
(StatusCode::CONFLICT, "bin already contains data\n").into_response()
|
|
}
|
|
Self::ParseTtl => (StatusCode::BAD_REQUEST, "invalid ttl class\n").into_response(),
|
|
Self::Oidc(response) => response.into_response(),
|
|
Self::InvalidMultipart => {
|
|
(StatusCode::BAD_REQUEST, "invalid multipart data").into_response()
|
|
}
|
|
_ => {
|
|
error!("{:?}", self);
|
|
(StatusCode::INTERNAL_SERVER_ERROR, "internal server error\n").into_response()
|
|
}
|
|
}
|
|
.into_response()
|
|
}
|
|
}
|