aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-05-17 17:23:29 +0200
committermetamuffin <metamuffin@disroot.org>2025-05-17 17:23:29 +0200
commit1c27a83409a7f51c5d07098cb6ca65bcee870d9c (patch)
treeed166844290443932c4fbf078d1cf65a1d79f833 /src/main.rs
downloadisda-1c27a83409a7f51c5d07098cb6ca65bcee870d9c.tar
isda-1c27a83409a7f51c5d07098cb6ca65bcee870d9c.tar.bz2
isda-1c27a83409a7f51c5d07098cb6ca65bcee870d9c.tar.zst
a
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs78
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(())
+ }
+}