diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-17 17:23:29 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-17 17:23:29 +0200 |
commit | 1c27a83409a7f51c5d07098cb6ca65bcee870d9c (patch) | |
tree | ed166844290443932c4fbf078d1cf65a1d79f833 /src/main.rs | |
download | isda-1c27a83409a7f51c5d07098cb6ca65bcee870d9c.tar isda-1c27a83409a7f51c5d07098cb6ca65bcee870d9c.tar.bz2 isda-1c27a83409a7f51c5d07098cb6ca65bcee870d9c.tar.zst |
a
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..a08ae6b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,78 @@ +pub mod ui; +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 worker_ws::{WorkerID, WorkerResponse, worker_websocket}; + +struct Worker { + accept: usize, + name: String, + sources: Vec<String>, + send: Sender<WorkerResponse>, +} + +#[derive(Default)] +struct State { + worker_id_counter: WorkerID, + workers: HashMap<WorkerID, Worker>, + + metadata: HashMap<String, Map<String, Value>>, + queue: HashSet<String>, + loading: HashSet<String>, + complete: HashSet<String>, +} + +#[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(async || "Hello world!")) + .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(()) + } +} |