Parent [>]
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}