1use axum::http::StatusCode;
2use axum::response::{IntoResponse, Response};
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum Error {
7 #[error(transparent)]
8 Io(#[from] std::io::Error),
9 #[error("repository not found: {0}")]
10 RepoNotFound(String),
11 #[error("not found: {0}")]
12 NotFound(String),
13 #[error("bad request: {0}")]
14 BadRequest(String),
15 #[error("corrupt object: {0}")]
16 GitCorrupt(String),
17}
18
19pub type Result<T> = std::result::Result<T, Error>;
20
21impl IntoResponse for Error {
22 fn into_response(self) -> Response {
23 let status = match &self {
24 Error::RepoNotFound(_) | Error::NotFound(_) => StatusCode::NOT_FOUND,
25 Error::BadRequest(_) => StatusCode::BAD_REQUEST,
26 Error::Io(_) | Error::GitCorrupt(_) => StatusCode::INTERNAL_SERVER_ERROR,
27 };
28 (status, self.to_string()).into_response()
29 }
30}