aboutsummaryrefslogtreecommitdiffstats
path: root/crates/server/src/handlers/mod.rs
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-07-09 21:43:23 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-07-09 21:43:23 +0200
commit3223d93cb3c77ab02aa0a35f2a8314e447cee9a4 (patch)
tree3971a1f37f5fe3cadb747c5229a0d54e868e45e3 /crates/server/src/handlers/mod.rs
parentfix(client/sync): Pass through precise error on `SyncError::WrongKey` (diff)
downloadatuin-3223d93cb3c77ab02aa0a35f2a8314e447cee9a4.zip
chore: Separate daemon, client, server, and lib into crates
Diffstat (limited to 'crates/server/src/handlers/mod.rs')
-rw-r--r--crates/server/src/handlers/mod.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/crates/server/src/handlers/mod.rs b/crates/server/src/handlers/mod.rs
new file mode 100644
index 00000000..c4332f80
--- /dev/null
+++ b/crates/server/src/handlers/mod.rs
@@ -0,0 +1,54 @@
+use crate::atuin_common::api::{ErrorResponse, IndexResponse};
+use axum::{Json, extract::State, http, response::IntoResponse};
+
+use crate::router::AppState;
+
+pub(crate) mod v0;
+
+const VERSION: &str = env!("CARGO_PKG_VERSION");
+
+pub(crate) async fn index(state: State<AppState>) -> 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_else(|| 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) -> Self {
+ Self {
+ reason: reason.into(),
+ }
+ }
+}