aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs
index 13a9b7f..729482f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,9 +3,18 @@
use dotenv::var;
use log::LevelFilter;
use std::fs::File;
-use lfm_embed::STATE;
+use std::sync::Arc;
+use lfm_embed::{STATE, ResponseCtx};
+use warp::Filter;
-fn main() {
+#[derive(serde::Deserialize, Debug)]
+struct UserQuery {
+ #[serde(default)]
+ theme: Option<Arc<str>>
+}
+
+#[tokio::main]
+async fn main() {
env_logger::Builder::new()
.filter_level(LevelFilter::Warn)
.parse_filters(&var("LFME_LOG_LEVEL").unwrap_or_default())
@@ -23,5 +32,23 @@ fn main() {
std::sync::LazyLock::force(&STATE);
-
+ let user = warp::path!("user" / String)
+ .and(warp::query::<UserQuery>())
+ .then(|s, q: UserQuery| async move {
+ log::info!(target: "lfm::server::user", "Handling request for user `{s}` with {q:?}");
+ let (ctx, dur) = STATE.get_userinfo(&s).await;
+ let ResponseCtx(data, status) = ctx.into();
+
+ let theme = q.theme.unwrap_or_else(|| STATE.default_theme());
+ warp::reply::with_header(
+ warp::reply::with_status(
+ warp::reply::html(
+ STATE.handlebars().render(&theme, &data).unwrap()
+ ), status
+ ), "Refresh", dur.as_secs()
+ )
+ });
+
+ warp::serve(user)
+ .bind(([127,0,0,1], STATE.port())).await;
}