aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs33
-rw-r--r--src/webui.rs6
-rw-r--r--src/worker_ws.rs8
3 files changed, 38 insertions, 9 deletions
diff --git a/src/main.rs b/src/main.rs
index e4a17e8..0441cc6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,13 +4,15 @@ pub mod webui;
pub mod webui_ws;
pub mod worker_ws;
-use anyhow::Result;
+use anyhow::{Result, anyhow};
use api::{api_complete_json, api_loading_json, api_queue_json};
use axum::{Router, routing::get};
-use log::{debug, info};
+use log::{debug, error, info};
use serde_json::{Map, Value};
use std::{
collections::{HashMap, HashSet},
+ env::args,
+ path::Path,
sync::Arc,
time::Instant,
};
@@ -40,6 +42,8 @@ pub struct State {
workers: HashMap<WorkerID, Worker>,
webui_broadcast: broadcast::Sender<Arc<WebuiEvent>>,
+ config: Value,
+
metadata: HashMap<String, Map<String, Value>>,
queue: HashSet<String>,
loading: HashSet<String>,
@@ -50,6 +54,7 @@ pub struct State {
async fn main() -> Result<()> {
env_logger::init_from_env("LOG");
let mut state = State::default();
+ state.load_config().await?;
state.load().await?;
let router = Router::new()
.route("/", get(webui))
@@ -69,6 +74,7 @@ async fn main() -> Result<()> {
impl Default for State {
fn default() -> Self {
Self {
+ config: Default::default(),
worker_id_counter: Default::default(),
workers: Default::default(),
webui_broadcast: broadcast::channel(1024).0,
@@ -81,13 +87,28 @@ impl Default for State {
}
impl State {
+ pub async fn load_config(&mut self) -> Result<()> {
+ let path = args()
+ .nth(1)
+ .ok_or(anyhow!("first argument is config path"))?;
+
+ self.config = serde_yml::from_str::<serde_json::Value>(&read_to_string(path).await?)?;
+ Ok(())
+ }
pub async fn load(&mut self) -> Result<()> {
debug!("loading state");
let t = Instant::now();
- 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?)?;
- info!("state loaded (took {:?})", t.elapsed());
+ if AsRef::<Path>::as_ref("metadata.json").exists()
+ && AsRef::<Path>::as_ref("queue.json").exists()
+ && AsRef::<Path>::as_ref("complete.json").exists()
+ {
+ 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?)?;
+ info!("state loaded (took {:?})", t.elapsed());
+ } else {
+ error!("some state files are missing, skipping load")
+ }
Ok(())
}
pub async fn save(&mut self) -> Result<()> {
diff --git a/src/webui.rs b/src/webui.rs
index 73add5f..ca314c9 100644
--- a/src/webui.rs
+++ b/src/webui.rs
@@ -46,9 +46,9 @@ pub(crate) async fn webui(S(state): S<Arc<RwLock<State>>>) -> Html<String> {
}}
}
section.tasks {
- @Taskbin {title: "Queued", state: "queue", set: &g.queue, default, g }
- @Taskbin {title: "Loading", state: "loading", set: &g.loading, default, g }
- @Taskbin {title: "Completed", state: "complete", set: &g.complete, default, g }
+ @Taskbin { title: "Queued", state: "queue", set: &g.queue, default, g }
+ @Taskbin { title: "Loading", state: "loading", set: &g.loading, default, g }
+ @Taskbin { title: "Completed", state: "complete", set: &g.complete, default, g }
}
}
}
diff --git a/src/worker_ws.rs b/src/worker_ws.rs
index 25ec7b0..f038100 100644
--- a/src/worker_ws.rs
+++ b/src/worker_ws.rs
@@ -56,6 +56,9 @@ pub enum WorkerResponse {
key: String,
data: Map<String, Value>,
},
+ Config {
+ config: Value,
+ },
Error {
message: String,
},
@@ -73,6 +76,11 @@ async fn worker_websocket_inner(ws: WebSocket, state: Arc<RwLock<State>>) {
let worker = {
let mut g = state.write().await;
+ tx.send(WorkerResponse::Config {
+ config: g.config.clone(),
+ })
+ .await
+ .unwrap();
let id = g.worker_id_counter;
g.worker_id_counter += 1;
g.workers.insert(