aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-server/src/handlers/mod.rs
blob: 2176ac5eeda62a1e931361a3d27db70638a8c1a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use atuin_common::api::{ErrorResponse, IndexResponse};
use atuin_server_database::Database;
use axum::{Json, extract::State, http, response::IntoResponse};

use crate::router::AppState;

pub mod health;
pub mod history;
pub mod record;
pub mod status;
pub mod user;
pub mod v0;

const VERSION: &str = env!("CARGO_PKG_VERSION");

pub async fn index<DB: Database>(state: State<AppState<DB>>) -> Json<IndexResponse> {
    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 struct ErrorResponseStatus<'a> {
    pub error: ErrorResponse<'a>,
    pub status: http::StatusCode,
}

pub 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(),
        }
    }
}