From 2f74010bad614dd69a7fd45d208bb2213f6a4e1f Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Thu, 6 Apr 2023 08:52:23 +0100 Subject: [PATCH] Start implementing server --- Cargo.lock | 1 + atuin-client/Cargo.toml | 3 ++ atuin-client/src/daemon/handlers/mod.rs | 8 +++++ atuin-client/src/daemon/mod.rs | 1 + atuin-client/src/daemon/router.rs | 44 +++++++++++++++++++++++++ atuin-client/src/lib.rs | 1 + atuin/src/command/client/daemon.rs | 2 +- 7 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 atuin-client/src/daemon/handlers/mod.rs create mode 100644 atuin-client/src/daemon/mod.rs create mode 100644 atuin-client/src/daemon/router.rs diff --git a/Cargo.lock b/Cargo.lock index 06feb06a..26a40a25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,6 +135,7 @@ version = "14.0.1" dependencies = [ "async-trait", "atuin-common", + "axum", "base64 0.21.0", "chrono", "clap", diff --git a/atuin-client/Cargo.toml b/atuin-client/Cargo.toml index 3542510c..6633a668 100644 --- a/atuin-client/Cargo.toml +++ b/atuin-client/Cargo.toml @@ -64,5 +64,8 @@ semver = { workspace = true } xsalsa20poly1305 = { version = "0.9.0", optional = true } generic-array = { version = "0.14", optional = true, features = ["serde"] } +# daemon +axum = "0.6.4" + [dev-dependencies] tokio = { version = "1", features = ["full"] } diff --git a/atuin-client/src/daemon/handlers/mod.rs b/atuin-client/src/daemon/handlers/mod.rs new file mode 100644 index 00000000..464c24a5 --- /dev/null +++ b/atuin-client/src/daemon/handlers/mod.rs @@ -0,0 +1,8 @@ + +const VERSION: &str = env!("CARGO_PKG_VERSION"); + +pub async fn index() -> Json { + Json(IndexResponse { + version: VERSION.to_string(), + }) +} diff --git a/atuin-client/src/daemon/mod.rs b/atuin-client/src/daemon/mod.rs new file mode 100644 index 00000000..fcddb5c6 --- /dev/null +++ b/atuin-client/src/daemon/mod.rs @@ -0,0 +1 @@ +pub mod router; diff --git a/atuin-client/src/daemon/router.rs b/atuin-client/src/daemon/router.rs new file mode 100644 index 00000000..6cc981a4 --- /dev/null +++ b/atuin-client/src/daemon/router.rs @@ -0,0 +1,44 @@ +use std::net::{IpAddr, SocketAddr}; + +use axum::{ + response::IntoResponse, + routing::{get}, + Router, + Server, +}; +use eyre::{Result}; + +use crate::settings::Settings; + +async fn teapot() -> impl IntoResponse { + (http::StatusCode::IM_A_TEAPOT, "☕") +} + +fn router( + settings: Settings, +) -> Router { + let routes = Router::new() + .route("/", get(handlers::index)); + + let path = settings.path.as_str(); + if path.is_empty() { + routes + } else { + Router::new().nest(path, routes) + } + .fallback(teapot) + .with_state(AppState { database, settings }) + .layer(ServiceBuilder::new().layer(TraceLayer::new_for_http())) +} + +pub async fn listen(settings: Settings, host: String, port: u16) -> Result<()> { + let host = host.parse::()?; + + let r = router(settings); + + Server::bind(&SocketAddr::new(host, port)) + .serve(r.into_make_service()) + .await?; + + Ok(()) +} diff --git a/atuin-client/src/lib.rs b/atuin-client/src/lib.rs index 497c5e74..8cd8e5ad 100644 --- a/atuin-client/src/lib.rs +++ b/atuin-client/src/lib.rs @@ -10,6 +10,7 @@ pub mod encryption; #[cfg(feature = "sync")] pub mod sync; +pub mod daemon; pub mod database; pub mod history; pub mod import; diff --git a/atuin/src/command/client/daemon.rs b/atuin/src/command/client/daemon.rs index e029fb31..9c30270f 100644 --- a/atuin/src/command/client/daemon.rs +++ b/atuin/src/command/client/daemon.rs @@ -6,7 +6,7 @@ use tracing_subscriber::FmtSubscriber; use daemonize::Daemonize; -use atuin_client::settings::Settings; +use atuin_client::{daemon, settings::Settings}; use tracing::{error, info, Level}; pub fn start(settings: Settings) -> Result<()> {