summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cli.rs26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/cli.rs b/src/cli.rs
index 2552f90..1c0d007 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -3,10 +3,15 @@
//! This module supports running `hi` as a freestanding program, via the
//! [`Args`] struct.
-use std::io;
-
-use axum::{middleware, Router};
-use clap::Parser;
+use std::{future, io};
+
+use axum::{
+ http::header,
+ middleware,
+ response::{IntoResponse, Response},
+ Router,
+};
+use clap::{CommandFactory, Parser};
use sqlx::sqlite::SqlitePool;
use tokio::net;
@@ -32,6 +37,7 @@ use crate::{app::App, boot, channel, clock, db, event, expire, login, message, u
/// ```
#[derive(Parser)]
#[command(
+ version,
about = "Run the `hi` server.",
long_about = r#"Run the `hi` server.
@@ -81,6 +87,7 @@ impl Args {
expire::middleware,
))
.route_layer(middleware::from_fn(clock::middleware))
+ .route_layer(middleware::map_response(Self::server_info()))
.with_state(app);
let listener = self.listener().await?;
@@ -106,6 +113,17 @@ impl Args {
async fn pool(&self) -> Result<SqlitePool, db::Error> {
db::prepare(&self.database_url, &self.backup_database_url).await
}
+
+ fn server_info() -> impl Clone + Fn(Response) -> future::Ready<Response> {
+ let command = Self::command();
+ let name = command.get_name();
+ let version = command.get_version().unwrap_or("unknown version");
+ let version = format!("{name}/{version}");
+ move |resp| {
+ let response = ([(header::SERVER, &version)], resp).into_response();
+ future::ready(response)
+ }
+ }
}
fn routers() -> Router<App> {