From 11d9454f8c2ce0fddd6cb0698744ec58aa2e5261 Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Wed, 3 Dec 2025 10:15:20 -0700 Subject: [PATCH] Begin implementing unshell_lib::manager functionality in server --- unshell-gui/Cargo.lock | 80 ++++----------------- unshell-gui/Cargo.toml | 1 - unshell-gui/src/config/mod.rs | 1 - unshell-gui/src/flowchart/force.rs | 34 --------- unshell-server/src/api/app.rs | 34 ++++----- unshell-server/src/lib.rs | 18 ++++- unshell-server/src/main.rs | 11 +-- unshell-server/src/{ => server}/database.rs | 22 ++---- unshell-server/src/server/manager.rs | 0 unshell-server/src/server/mod.rs | 30 ++++++++ 10 files changed, 85 insertions(+), 146 deletions(-) rename unshell-server/src/{ => server}/database.rs (86%) create mode 100644 unshell-server/src/server/manager.rs create mode 100644 unshell-server/src/server/mod.rs diff --git a/unshell-gui/Cargo.lock b/unshell-gui/Cargo.lock index 1bc1dc6..75c87d7 100644 --- a/unshell-gui/Cargo.lock +++ b/unshell-gui/Cargo.lock @@ -485,15 +485,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -[[package]] -name = "ecolor" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" -dependencies = [ - "emath 0.31.1", -] - [[package]] name = "ecolor" version = "0.33.2" @@ -501,7 +492,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "084980ebede2fb1ad6c4f54285b3e489052ef2b6aa4016e4c19349417adc75c5" dependencies = [ "bytemuck", - "emath 0.33.2", + "emath", "serde", ] @@ -514,7 +505,7 @@ dependencies = [ "ahash", "bytemuck", "document-features", - "egui 0.33.2", + "egui", "egui-wgpu", "egui-winit", "egui_glow", @@ -543,20 +534,6 @@ dependencies = [ "winit", ] -[[package]] -name = "egui" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" -dependencies = [ - "ahash", - "bitflags 2.10.0", - "emath 0.31.1", - "epaint 0.31.1", - "nohash-hasher", - "profiling", -] - [[package]] name = "egui" version = "0.33.2" @@ -566,8 +543,8 @@ dependencies = [ "accesskit", "ahash", "bitflags 2.10.0", - "emath 0.33.2", - "epaint 0.33.2", + "emath", + "epaint", "log", "nohash-hasher", "profiling", @@ -577,15 +554,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "egui-dropdown" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d277c6c1f49e4e227344e920132d2d22a51810296b5c78f90e6aef4eed63ea" -dependencies = [ - "egui 0.31.1", -] - [[package]] name = "egui-wgpu" version = "0.33.2" @@ -595,8 +563,8 @@ dependencies = [ "ahash", "bytemuck", "document-features", - "egui 0.33.2", - "epaint 0.33.2", + "egui", + "epaint", "log", "profiling", "thiserror 2.0.17", @@ -614,7 +582,7 @@ checksum = "4772ed5f16fa8ec2ba295e58f62b58ee83fcf49e67ec13d2b7ddf4e9a2dea34e" dependencies = [ "arboard", "bytemuck", - "egui 0.33.2", + "egui", "log", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -635,7 +603,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "550e844e608e356f4ad6843c510aa9bb5838b427e4700ed0056e9746ceeed866" dependencies = [ "ahash", - "egui 0.33.2", + "egui", "enum-map", "log", "mime_guess2", @@ -649,7 +617,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b94ff67a1d18933fff2519f5f57c388f932c093036c381fb9ae2853b3e1e09" dependencies = [ "bytemuck", - "egui 0.33.2", + "egui", "glow", "log", "memoffset", @@ -666,7 +634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebfac3ca35f5e4fe217d3b03312111b234fe55ce059faf62b4cb47f7cf6d54f1" dependencies = [ "ahash", - "egui 0.33.2", + "egui", "itertools", "log", "serde", @@ -678,12 +646,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "emath" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" - [[package]] name = "emath" version = "0.33.2" @@ -725,21 +687,6 @@ dependencies = [ "syn", ] -[[package]] -name = "epaint" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" -dependencies = [ - "ab_glyph", - "ahash", - "ecolor 0.31.1", - "emath 0.31.1", - "nohash-hasher", - "parking_lot", - "profiling", -] - [[package]] name = "epaint" version = "0.33.2" @@ -749,8 +696,8 @@ dependencies = [ "ab_glyph", "ahash", "bytemuck", - "ecolor 0.33.2", - "emath 0.33.2", + "ecolor", + "emath", "epaint_default_fonts", "log", "nohash-hasher", @@ -2454,8 +2401,7 @@ version = "0.1.0" dependencies = [ "chrono", "eframe", - "egui 0.33.2", - "egui-dropdown", + "egui", "egui_extras", "egui_tiles", "log", diff --git a/unshell-gui/Cargo.toml b/unshell-gui/Cargo.toml index 97d9cf2..be2cebf 100644 --- a/unshell-gui/Cargo.toml +++ b/unshell-gui/Cargo.toml @@ -41,7 +41,6 @@ wasm-bindgen = "0.2.106" web-sys = "0.3.70" # to access the DOM (to hide the loading text) serde_json = "1.0.145" chrono = "0.4.42" -egui-dropdown = "0.13.0" [profile.release] opt-level = 2 # fast and small wasm diff --git a/unshell-gui/src/config/mod.rs b/unshell-gui/src/config/mod.rs index a35faa4..0ec9909 100644 --- a/unshell-gui/src/config/mod.rs +++ b/unshell-gui/src/config/mod.rs @@ -3,7 +3,6 @@ use std::{ sync::{Arc, Mutex}, }; -use egui::ComboBox; use egui_extras::{Column, TableBuilder}; use crate::auth::Auth; diff --git a/unshell-gui/src/flowchart/force.rs b/unshell-gui/src/flowchart/force.rs index e0fb311..6ecf70c 100644 --- a/unshell-gui/src/flowchart/force.rs +++ b/unshell-gui/src/flowchart/force.rs @@ -103,38 +103,4 @@ impl FlowChart { m.vel = Vec2::ZERO; } } - - // pub fn get_positions(&self) -> &[Vec2] { - // &self.positions - // } - - // pub fn get_connections(&self) -> &[(usize, usize)] { - // &self.connections - // } } - -// fn main() { -// // Example usage: Create a simple triangle graph -// let connections = vec![(0, 1), (1, 2), (2, 0)]; -// let mut graph = ForceDirectedGraph::new( -// 3, -// connections, -// 1000.0, // repulsion_strength -// 0.1, // attraction_strength -// 50.0, // rest_length -// 0.9, // damping -// ); - -// // Simulate 100 frames at 60 FPS -// let delta_time = 1.0 / 60.0; -// for frame in 0..100 { -// graph.update(delta_time); - -// if frame % 20 == 0 { -// println!("Frame {}: ", frame); -// for (i, pos) in graph.get_positions().iter().enumerate() { -// println!(" Node {}: ({:.2}, {:.2})", i, pos.x, pos.y); -// } -// } -// } -// } diff --git a/unshell-server/src/api/app.rs b/unshell-server/src/api/app.rs index 08a061a..5c6c690 100644 --- a/unshell-server/src/api/app.rs +++ b/unshell-server/src/api/app.rs @@ -9,10 +9,10 @@ use unshell_lib::{debug, info}; use crate::{ api::{auth, structs::CurrentUser}, - database::Database, + server::Server, }; -pub async fn start_api(address: &str, database: Database) { +pub async fn start_api(address: &str, server: Server) { let listener = TcpListener::bind(address) .await .expect("Unable to start listener"); @@ -25,19 +25,19 @@ pub async fn start_api(address: &str, database: Database) { router = route_get_tree_keys(router); router = route_trees(router); - axum::serve(listener, router.with_state(database)) + axum::serve(listener, router.with_state(server)) .await .expect("Error serving application"); } // Route the "keys" api for each tree -fn route_get_trees(router: Router) -> Router { +fn route_get_trees(router: Router) -> Router { router.route( "/api/trees", get( - async |State(database): State, Extension(_): Extension| { + async |State(server): State, Extension(_): Extension| { debug!("GET /api/trees"); - let result = database.get_trees(); + let result = server.get_trees(); Json(serde_json::to_value(result).unwrap()) }, @@ -47,15 +47,15 @@ fn route_get_trees(router: Router) -> Router { } // Route the "keys" api for each tree -fn route_get_tree_keys(router: Router) -> Router { +fn route_get_tree_keys(router: Router) -> Router { router.route( "/api/keys/{*path}", get( - async |State(database): State, + async |State(server): State, Path(path): Path, Extension(_): Extension| { debug!("GET /api/keys/{}", path); - let result = database.get_keys(&path); + let result = server.get_keys(&path); Json(serde_json::to_value(result).unwrap()) }, @@ -65,15 +65,15 @@ fn route_get_tree_keys(router: Router) -> Router { } // Route the "values" api to get all the values for each tree -fn route_get_all_tree_values(router: Router) -> Router { +fn route_get_all_tree_values(router: Router) -> Router { router.route( "/api/values/{*path}", get( - async |State(database): State, + async |State(server): State, Path(path): Path, Extension(_): Extension| { debug!("GET /api/values/{}", path); - let result = database.all_tree_values(&path); + let result = server.all_tree_values(&path); Json(serde_json::to_value(result).unwrap()) }, @@ -83,17 +83,17 @@ fn route_get_all_tree_values(router: Router) -> Router { } // Loop through all trees and add /api// POST aand GET listeners for them -fn route_trees(mut router: Router) -> Router { +fn route_trees(mut router: Router) -> Router { for tree in crate::DATABASE_TREES.iter() { router = router // Route GET requests to this tree .route( &format!("/api/{}/{{*path}}", tree), get( - async |State(database): State, + async |State(server): State, Path(path): Path, Extension(_): Extension| { - let result = database.get_value(tree, &path); + let result = server.get_value(tree, &path); debug!("GET /api/{}/{}", tree.to_string(), path); Json(serde_json::to_value(result).unwrap()) @@ -105,11 +105,11 @@ fn route_trees(mut router: Router) -> Router { .route( &format!("/api/{}/{{*path}}", tree), post( - async |State(database): State, + async |State(server): State, Path(path): Path, Extension(_): Extension, body: String| { - let result = database.put_value(tree, &path, &body); + let result = server.put_value(tree, &path, &body); debug!("POST /api/{}/{}", tree.to_string(), path); Json(serde_json::to_value(result).unwrap()) diff --git a/unshell-server/src/lib.rs b/unshell-server/src/lib.rs index 0db17f8..263369d 100644 --- a/unshell-server/src/lib.rs +++ b/unshell-server/src/lib.rs @@ -1,8 +1,22 @@ // #![macro_use] mod api; -pub mod database; +mod server; pub use api::app::start_api; +pub use server::Server; + #[static_init::dynamic] -static DATABASE_TREES: Vec<&'static str> = vec!["users"]; +pub static DATABASE_TREES: Vec<&'static str> = vec!["users"]; + +#[static_init::dynamic] +pub static DEFAULT_HOST: String = "localhost".to_string(); +#[static_init::dynamic] +pub static DATABASE_NAME: String = "database".to_string(); + +#[static_init::dynamic] +pub static SERVER_CONFIG: unshell_lib::config::PayloadConfig = unshell_lib::config::PayloadConfig { + id: "Server", + components: unshell_lib::get_components(), + runtime_config: Vec::new(), +}; diff --git a/unshell-server/src/main.rs b/unshell-server/src/main.rs index 6c687a7..56d785b 100644 --- a/unshell-server/src/main.rs +++ b/unshell-server/src/main.rs @@ -1,12 +1,7 @@ -use unshell_server::{database::Database, start_api}; +use unshell_server::{Server, start_api}; use clap::Parser; -use static_init::dynamic; - -#[dynamic] -static DEFAULT_HOST: String = "localhost".to_string(); -#[dynamic] -static DATABASE_NAME: String = "database".to_string(); +use unshell_server::{DATABASE_NAME, DEFAULT_HOST}; /// A fictional versioning CLI #[derive(Debug, Parser)] @@ -32,7 +27,7 @@ async fn main() { unshell_lib::logger::PrettyLogger::init(); - let database = Database::new(args.database_name); + let database = Server::new(args.database_name); start_api(&format!("{}:{}", args.host, args.port), database).await; } diff --git a/unshell-server/src/database.rs b/unshell-server/src/server/database.rs similarity index 86% rename from unshell-server/src/database.rs rename to unshell-server/src/server/database.rs index 64f04df..8dfe832 100644 --- a/unshell-server/src/database.rs +++ b/unshell-server/src/server/database.rs @@ -3,18 +3,14 @@ use std::collections::HashMap; use sled::Tree; use unshell_lib::error; -#[derive(Clone)] -pub struct Database { - db: sled::Db, -} +use crate::server::Server; -impl Database { - pub fn new(database: String) -> Self { - Self { - db: sled::open(database).expect("Failed to open database"), - } - } +// #[derive(Clone)] +// pub struct Database { +// db: sled::Db, +// } +impl Server { fn get_tree(&self, tree_name: &str) -> Result { self.db.open_tree(tree_name).map_err(|e| { error!("DB Failed to open tree: {}", e); @@ -77,9 +73,3 @@ impl Database { .collect::>()) } } - -impl Drop for Database { - fn drop(&mut self) { - self.db.flush().expect("Failed to flush database on drop"); - } -} diff --git a/unshell-server/src/server/manager.rs b/unshell-server/src/server/manager.rs new file mode 100644 index 0000000..e69de29 diff --git a/unshell-server/src/server/mod.rs b/unshell-server/src/server/mod.rs new file mode 100644 index 0000000..e5f0a2a --- /dev/null +++ b/unshell-server/src/server/mod.rs @@ -0,0 +1,30 @@ +mod database; +mod manager; + +use std::sync::{Arc, Mutex}; + +use unshell_lib::module::Manager; + +use crate::SERVER_CONFIG; + +#[derive(Clone)] +pub struct Server { + pub manager: Arc>, + pub db: sled::Db, +} + +impl Server { + pub fn new(database: String) -> Self { + Self { + manager: Manager::start(&SERVER_CONFIG, Vec::new()), + db: sled::open(database).expect("Failed to open database"), + } + } +} + +impl Drop for Server { + fn drop(&mut self) { + self.db.flush().expect("Failed to flush database on drop"); + Manager::join(self.manager.clone()); + } +}