use crate::State; use axum::extract::State as S; use axum::response::Html; use serde_json::{Map, Value}; use std::sync::Arc; use tokio::sync::RwLock; pub(crate) async fn webui(S(state): S>>) -> Html { let g = state.read().await; let doc = markup::new! { html { head { meta[charset="UTF-8"]; title { "" } } body { section { h2 { "Workers"} ul { @for (id, w) in &g.workers { li { div { h3 { @w.name } span { "ID: " @id } " " @if w.accept > 0 { span { "Accepting Jobs (" @w.accept ")" } } else { span { "Idle" } } }} }} } section { h2 { "Queued" } ul { @for key in &g.queue { li { @key } }} } section { h2 { "Loading" } ul { @for key in &g.loading { li { @key } }} } section { h2 { "Completed" } ul { @for key in &g.complete { li { @key } }} } } } }; Html(doc.to_string()) } markup::define!( Task<'a>(key: &'a str, data: &'a Map) { div.task { h3 { @data["title"].as_str().unwrap_or(key) } spawn.key { @key } } } );