use axum::{extract::State, routing::post, Form, Router}; use serde::Deserialize; use tokio::{net::TcpListener, sync::mpsc}; use crate::drawer::Command; #[derive(Clone)] struct Server { tx: mpsc::Sender, } pub async fn run(tx: mpsc::Sender, addr: String) -> anyhow::Result<()> { let app = Router::new() .route("/stop", post(post_stop)) .route("/test", post(post_test)) .route("/rip", post(post_rip)) .route("/text", post(post_text)) .route("/chat_message", post(post_chat_message)) .with_state(Server { tx }); let listener = TcpListener::bind(addr).await?; axum::serve(listener, app).await?; Ok(()) } async fn post_stop(server: State) { let _ = server.tx.send(Command::Stop).await; } async fn post_test(server: State) { let _ = server.tx.send(Command::Test).await; } async fn post_rip(server: State) { let _ = server.tx.send(Command::Rip).await; } #[derive(Deserialize)] struct PostTextForm { text: String, } async fn post_text(server: State, request: Form) { let _ = server.tx.send(Command::Text(request.0.text)).await; } #[derive(Deserialize)] struct PostChatMessageForm { username: String, content: String, } async fn post_chat_message(server: State, request: Form) { let _ = server .tx .send(Command::ChatMessage { username: request.0.username, content: request.0.content, }) .await; }