use crate::atuin_common::api::{ErrorResponse, IndexResponse}; use crate::atuin_server_database::Database; use axum::{Json, extract::State, http, response::IntoResponse}; use crate::atuin_server::router::AppState; pub(crate) mod health; pub(crate) mod history; pub(crate) mod record; pub(crate) mod status; pub(crate) mod user; pub(crate) mod v0; const VERSION: &str = env!("CARGO_PKG_VERSION"); pub(crate) async fn index(state: State>) -> Json { let homage = r#""Through the fathomless deeps of space swims the star turtle Great A'Tuin, bearing on its back the four giant elephants who carry on their shoulders the mass of the Discworld." -- Sir Terry Pratchett"#; let version = state .settings .fake_version .clone() .unwrap_or(VERSION.to_string()); Json(IndexResponse { homage: homage.to_string(), version, }) } impl IntoResponse for ErrorResponseStatus<'_> { fn into_response(self) -> axum::response::Response { (self.status, Json(self.error)).into_response() } } pub(crate) struct ErrorResponseStatus<'a> { pub(crate) error: ErrorResponse<'a>, pub(crate) status: http::StatusCode, } pub(crate) trait RespExt<'a> { fn with_status(self, status: http::StatusCode) -> ErrorResponseStatus<'a>; fn reply(reason: &'a str) -> Self; } impl<'a> RespExt<'a> for ErrorResponse<'a> { fn with_status(self, status: http::StatusCode) -> ErrorResponseStatus<'a> { ErrorResponseStatus { error: self, status, } } fn reply(reason: &'a str) -> ErrorResponse<'a> { Self { reason: reason.into(), } } }