From 2b934876e01d2e0952389eb9051bed6973e1a0a7 Mon Sep 17 00:00:00 2001
From: Compositr <compositr@compositr.dev>
Date: Sat, 2 Nov 2024 21:21:08 +1100
Subject: [PATCH] refactor+deps: cleanup code, remove unused dep

---
 CHANGELOG.md    |   7 +++-
 Cargo.lock      | 102 ------------------------------------------------
 Cargo.toml      |   1 -
 src/handlers.rs |   4 +-
 src/main.rs     |  11 ++----
 src/threads.rs  |  40 ++++++++++++++-----
 6 files changed, 40 insertions(+), 125 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3b45931..e4f2294 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,2 +1,7 @@
+# 1.0.0 / 2024-11-02
+- Added multithreading support
+- Fixed spelling error in CORS headers
+- Removed unnecessary crates
+
 # v0.1.0
-- Initial release
\ No newline at end of file
+- Initial release
diff --git a/Cargo.lock b/Cargo.lock
index 65fdb97..b1311ac 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -56,12 +56,6 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
-[[package]]
-name = "cfg_aliases"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
-
 [[package]]
 name = "color_quant"
 version = "1.1.0"
@@ -86,16 +80,6 @@ dependencies = [
  "cfg-if",
 ]
 
-[[package]]
-name = "ctrlc"
-version = "3.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3"
-dependencies = [
- "nix",
- "windows-sys",
-]
-
 [[package]]
 name = "data-url"
 version = "0.3.1"
@@ -214,7 +198,6 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
 name = "luciders"
 version = "0.1.0"
 dependencies = [
- "ctrlc",
  "indoc",
  "resvg",
 ]
@@ -238,18 +221,6 @@ dependencies = [
  "simd-adler32",
 ]
 
-[[package]]
-name = "nix"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
-dependencies = [
- "bitflags 2.6.0",
- "cfg-if",
- "cfg_aliases",
- "libc",
-]
-
 [[package]]
 name = "pico-args"
 version = "0.5.0"
@@ -505,79 +476,6 @@ version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
 
-[[package]]
-name = "windows-sys"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-
 [[package]]
 name = "xmlwriter"
 version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index b884eee..cfa8bf0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,6 +5,5 @@ edition = "2021"
 license = "AGPL-3.0-only"
 
 [dependencies]
-ctrlc = "3.4.5"
 indoc = "2.0.5"
 resvg = "0.44.0"
diff --git a/src/handlers.rs b/src/handlers.rs
index 6cd8042..d5bd893 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -6,9 +6,7 @@ use crate::{
     threads::ThreadPool,
 };
 use std::{
-    collections::HashMap,
-    net::{Shutdown, TcpListener},
-    sync::Arc,
+    collections::HashMap, error::Error, net::{Shutdown, TcpListener}, sync::Arc
 };
 
 type DynHandlerFn = dyn Fn(Request) -> Response + Send + Sync;
diff --git a/src/main.rs b/src/main.rs
index bebff72..77fdc82 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,5 @@
 use std::{net::TcpListener, process, sync::Arc};
 
-use ctrlc;
 use http::responses::{Body, Response};
 
 use resvg::{
@@ -26,12 +25,6 @@ fn main() {
     let listener = TcpListener::bind(format!("[::]:{}", port))
         .unwrap_or_else(|_| fatal("Failed to bind to address"));
 
-    ctrlc::set_handler(move || {
-        println!("Shutting down...");
-        process::exit(0);
-    })
-    .unwrap_or_else(|_| fatal("Failed to set termination signal handler"));
-
     let icons_rc = Arc::new(match icons::Icons::build() {
         Ok(icons) => icons,
         Err(e) => fatal(e),
@@ -245,7 +238,9 @@ fn main() {
         }
     });
 
-    handlers.bind(listener);
+    handlers
+        .bind(listener)
+        .unwrap_or_else(|_| fatal("Failed to bind handlers"));
 
     println!("luciders started on port {}", port);
     println!("Serving {} icons", icons_rc.icons_len())
diff --git a/src/threads.rs b/src/threads.rs
index f8e8d03..cb23132 100644
--- a/src/threads.rs
+++ b/src/threads.rs
@@ -27,15 +27,21 @@ impl ThreadPool {
             }
         }
 
-        Some(ThreadPool { sender: Some(sender), workers })
+        Some(ThreadPool {
+            sender: Some(sender),
+            workers,
+        })
     }
 
+    /// Pass a function to a worker thread to execute
+    ///
+    /// f: Function to execute
     pub fn execute<F>(&self, f: F) -> Result<(), mpsc::SendError<Job>>
     where
         F: FnOnce() + Send + 'static,
     {
         let job = Box::new(f);
-        
+
         match self.sender.as_ref() {
             Some(sender) => sender.send(job),
             None => Err(mpsc::SendError(job)),
@@ -46,10 +52,13 @@ impl ThreadPool {
 impl Drop for ThreadPool {
     fn drop(&mut self) {
         drop(self.sender.take());
-    
+
         for worker in &mut self.workers {
+            println!("Shutting down worker {}", worker.id);
             if let Some(thread) = worker.thread.take() {
-                thread.join().expect("Failed to join worker thread on shutdown!")
+                thread
+                    .join()
+                    .expect("Failed to join worker thread on shutdown!")
             }
         }
     }
@@ -61,16 +70,27 @@ struct Worker {
 }
 
 impl Worker {
+    /// Create a new Worker
+    ///
+    /// id: Worker ID
+    /// receiver: Receiver to listen for jobs, wrapped in an Arc and Mutex to share among threads
     fn build(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Option<Self> {
         let builder = thread::Builder::new().name(format!("worker-{}", id));
 
-        let thread = match builder.spawn(move || loop {
-            let job = match receiver.lock().expect("Failed to lock receiver! Maybe the Mutex is poisoned?").recv() {
-                Ok(job) => job,
-                Err(_) => break,
-            };
+        let thread = match builder.spawn(move || {
+            println!("Worker {} spawned", id);
+            loop {
+                let job = match receiver
+                    .lock()
+                    .expect("Failed to lock receiver! Maybe the Mutex is poisoned?")
+                    .recv()
+                {
+                    Ok(job) => job,
+                    Err(_) => break,
+                };
 
-            job();
+                job();
+            }
         }) {
             Ok(thread) => Some(thread),
             Err(_) => return None,