pub mod helper; pub mod webui; pub mod worker_ws; use anyhow::Result; use axum::{Router, routing::get}; use serde_json::{Map, Value}; use std::{ collections::{HashMap, HashSet}, sync::Arc, }; use tokio::{ fs::{File, read_to_string, rename}, io::AsyncWriteExt, net::TcpListener, sync::{RwLock, mpsc::Sender}, }; use webui::{webui, webui_style}; use worker_ws::{WorkerID, WorkerResponse, worker_websocket}; pub struct Worker { accept: usize, name: String, sources: Vec, send: Sender, } #[derive(Default)] struct State { worker_id_counter: WorkerID, workers: HashMap, metadata: HashMap>, queue: HashSet, loading: HashSet, complete: HashSet, } #[tokio::main] async fn main() -> Result<()> { env_logger::init_from_env("LOG"); let mut state = State::default(); state.load().await?; let router = Router::new() .route("/", get(webui)) .route("/style.css", get(webui_style)) .route("/worker_ws", get(worker_websocket)) .with_state(Arc::new(RwLock::new(state))); let listener = TcpListener::bind("127.0.0.1:8080").await?; axum::serve(listener, router).await?; Ok(()) } impl State { pub async fn load(&mut self) -> Result<()> { self.metadata = serde_json::from_str(&read_to_string("metadata.json").await?)?; self.queue = serde_json::from_str(&read_to_string("queue.json").await?)?; self.complete = serde_json::from_str(&read_to_string("complete.json").await?)?; Ok(()) } pub async fn save(&mut self) -> Result<()> { File::create("metadata.json~") .await? .write_all(&serde_json::to_vec(&self.metadata)?) .await?; File::create("queue.json~") .await? .write_all(&serde_json::to_vec(&self.queue)?) .await?; File::create("complete.json~") .await? .write_all(&serde_json::to_vec(&self.complete)?) .await?; rename("metadata.json~", "metadata.json").await?; rename("queue.json~", "queue.json").await?; rename("complete.json~", "complete.json").await?; Ok(()) } }