diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 08b7078e..ccfa8fd1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -15,12 +15,7 @@ - - - - - diff --git a/DesignModule04/StockMarket/src/README.md b/DesignModule04/StockMarket/src/README.md deleted file mode 100644 index 9a9e6420..00000000 --- a/DesignModule04/StockMarket/src/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Stock Market Monitor (Observer Pattern) - -This markdown content has been refactored: - -## Overview - -This project showcases the implementation of the Observer pattern in Rust using a Stock Market monitoring system as an example. - -## Features - -- Real-time updates of stock prices to multiple observers -- Support for different types of observers (displays and alert systems) -- Easy addition of new observers - -## Mermaid Diagram - -The following diagram illustrates the structure and flow of the Stock Market Monitor using the Observer pattern: - -```mermaid -classDiagram - class StockObserver { - <> - +update(symbol: str, price: f64) - } - class StockMarket { - -prices: HashMap - -observers: Vec>> - +add_observer(observer: Rc>) - +set_price(symbol: str, price: f64) - -notify_observers(symbol: str, price: f64) - } - class PriceDisplay { - -name: String - +update(symbol: str, price: f64) - } - class AlertSystem { - -threshold: f64 - +update(symbol: str, price: f64) - } - - StockMarket ..> StockObserver : notifies - PriceDisplay ..|> StockObserver - AlertSystem ..|> StockObserver -``` - -## How it works - -1. The `StockMarket` (subject) maintains a list of observers and current stock prices. -2. Observers (`PriceDisplay` and `AlertSystem`) implement the `StockObserver` trait. -3. When a stock price is updated via `set_price()`, all registered observers are notified. -4. Each observer type handles the update differently: - - `PriceDisplay` simply displays the new price. - - `AlertSystem` checks if the price exceeds a threshold and issues an alert if it does. - -## Usage - -To use the Stock Market Monitor in your code: - -```rust -let mut stock_market = StockMarket::new(); - -let display = Rc::new(RefCell::new(PriceDisplay { - name: String::from("Main Display"), -})); -let alert = Rc::new(RefCell::new(AlertSystem { - threshold: 100.0, -})); - -stock_market.add_observer(display); -stock_market.add_observer(alert); - -// Update a stock price -stock_market.set_price("AAPL", 150.0); -``` - -## Running the Example - -1. Ensure you have Rust installed. -2. Clone this repository. -3. Run `cargo run` to see the Stock Market Monitor in action. - -## Notes - -The Observer pattern is excellent for implementing distributed event handling systems. It's widely used in implementing distributed event handling systems, MVC architectural pattern, and in designing user interface toolkits. However, if overused, it can lead to complex systems where observers are difficult to track and maintain. diff --git a/DesignModule04/StockMarket/src/main.rs b/DesignModule04/StockMarket/src/main.rs deleted file mode 100644 index 869109f6..00000000 --- a/DesignModule04/StockMarket/src/main.rs +++ /dev/null @@ -1,158 +0,0 @@ -use std::collections::HashMap; -use std::rc::Rc; -use std::borrow::Cow; - -// Observer trait -trait StockObserver { - fn update(&self, symbol: Cow, price: f64); -} - -// Subject (Observable) -struct StockMarket { - prices: HashMap, - observers: Vec>, -} - -impl StockMarket { - fn new() -> Self { - StockMarket { - prices: HashMap::with_capacity(10), - observers: Vec::with_capacity(10), - } - } - - fn add_observer(&mut self, observer: Rc) { - self.observers.push(observer); - } - - fn set_price(&mut self, symbol: &str, price: f64) { - self.prices.insert(symbol.to_string(), price); - self.notify_observers(symbol, price); - } - - fn notify_observers(&self, symbol: &str, price: f64) { - let symbol = Cow::Borrowed(symbol); - for observer in &self.observers { - observer.update(symbol.clone(), price); - } - } -} - -// Concrete Observers -struct PriceDisplay { - name: String, -} - -impl StockObserver for PriceDisplay { - fn update(&self, symbol: Cow, price: f64) { - println!("{}: {} stock updated to ${:.2}", self.name, symbol, price); - } -} - -struct AlertSystem { - threshold: f64, -} - -impl StockObserver for AlertSystem { - fn update(&self, symbol: Cow, price: f64) { - if price > self.threshold { - println!("ALERT: {} stock price ${:.2} exceeds threshold ${:.2}", symbol, price, self.threshold); - } - } -} - -fn main() { - let mut stock_market = StockMarket::new(); - - let display1 = Rc::new(PriceDisplay { - name: String::from("Display 1"), - }); - let display2 = Rc::new(PriceDisplay { - name: String::from("Display 2"), - }); - let alert_system = Rc::new(AlertSystem { - threshold: 100.0, - }); - - stock_market.add_observer(display1); - stock_market.add_observer(display2); - stock_market.add_observer(alert_system); - - // Simulate stock price changes - stock_market.set_price("AAPL", 15.0); - stock_market.set_price("GOOGL", 1330.0); - stock_market.set_price("MSFT", 95.0); - stock_market.set_price("MSFT", 120.0); -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_stock_market() { - let mut stock_market = StockMarket::new(); - - let display1 = Rc::new(PriceDisplay { - name: String::from("Display 1"), - }); - let display2 = Rc::new(PriceDisplay { - name: String::from("Display 2"), - }); - let alert_system = Rc::new(AlertSystem { - threshold: 100.0, - }); - - stock_market.add_observer(display1); - stock_market.add_observer(display2); - stock_market.add_observer(alert_system); - - stock_market.set_price("AAPL", 15.0); - stock_market.set_price("GOOGL", 1330.0); - stock_market.set_price("MSFT", 95.0); - stock_market.set_price("MSFT", 120.0); - } - - #[test] - fn test_price_display() { - let display = PriceDisplay { - name: String::from("Display 1"), - }; - display.update(Cow::Borrowed("AAPL"), 15.0); - } - - #[test] - fn test_alert_system() { - let alert = AlertSystem { - threshold: 100.0, - }; - alert.update(Cow::Borrowed("AAPL"), 105.0); - } - - #[test] - fn test_stock_observer() { - let display = PriceDisplay { - name: String::from("Display 1"), - }; - let observer: &dyn StockObserver = &display; - observer.update(Cow::Borrowed("AAPL"), 15.0); - } - - #[test] - fn test_stock_observer_vec() { - let display1 = Rc::new(PriceDisplay { - name: String::from("Display 1"), - }); - let display2 = Rc::new(PriceDisplay { - name: String::from("Display 2"), - }); - - let mut observers: Vec> = Vec::new(); - observers.push(display1); - observers.push(display2); - - for observer in &observers { - observer.update(Cow::Borrowed("AAPL"), 15.0); - } - } -} \ No newline at end of file diff --git a/DesignModule04/config_man/Readme.md b/DesignModule04/config_man/Readme.md deleted file mode 100644 index 87e3c508..00000000 --- a/DesignModule04/config_man/Readme.md +++ /dev/null @@ -1,70 +0,0 @@ -# ConfigManager Singleton - -This project demonstrates the Singleton pattern in Rust using a `ConfigManager` as a real-world example. - -## Overview - -The `ConfigManager` is a thread-safe, globally accessible configuration manager that ensures only one instance of the configuration is created and shared across the entire application. - -## Features - -- Thread-safe access to configuration -- Lazy initialization -- Read and write configuration values -- Persist configuration to a file - -## Mermaid Diagram - -The following diagram illustrates the structure and flow of the ConfigManager Singleton: - -```mermaid -graph TD - A[Application] -->|1. First access| B{ConfigManager
Already created?} - B -->|No| C[Create new ConfigManager] - C --> D[Load config from file] - D --> E[Store in static SINGLETON] - B -->|Yes| E - E --> F[Return Arc>] - A -->|2. Subsequent access| F - F --> G[Thread 1: Read/Write Config] - F --> H[Thread 2: Read/Write Config] - F --> I[Thread 3: Read/Write Config] - G & H & I --> J[Save Config to File] -``` - -## How It Works - -1. The application requests access to the ConfigManager via the `get_config()` function. -2. If it's the first access, a new ConfigManager is created, the configuration is loaded from a file, and the instance is stored in a static variable. -3. For all accesses (first and subsequent), an `Arc>` is returned, allowing thread-safe access to the shared configuration. -4. Multiple threads can read from and write to the configuration concurrently. -5. Changes to the configuration can be saved back to the file. - -## Usage - -To use the ConfigManager Singleton in your code: - -```rust -let config = get_config(); -let config_guard = config.lock().unwrap(); - -// Read a value -let db_url = config_guard.get("database_url").cloned().unwrap_or_default(); - -// Write a value -config_guard.set("new_key".to_string(), "new_value".to_string()); - -// Save changes -config_guard.save().unwrap(); -``` - -## Running the Example - -1. Ensure you have Rust installed. -2. Clone this repository. -3. Create a `config.toml` file in the project root with some initial configuration. -4. Run `cargo run` to see the ConfigManager in action. - -## Notes - -While the Singleton pattern can be useful for managing global state, it should be used judiciously. Consider whether dependency injection or simple module-level variables might be more appropriate for your use case. diff --git a/DesignModule04/config_man/src/main.rs b/DesignModule04/config_man/src/main.rs deleted file mode 100644 index dfa2c1a8..00000000 --- a/DesignModule04/config_man/src/main.rs +++ /dev/null @@ -1,132 +0,0 @@ -use std::collections::HashMap; -use std::sync::{Arc, Mutex, Once}; -use std::fs; -use std::io; -use std::thread; - -struct ConfigManager { - config: HashMap, -} - -impl ConfigManager { - fn new() -> Result { - let config_str = fs::read_to_string("src/config.toml")?; - let config = parse_config(&config_str); - Ok(ConfigManager { config }) - } - - fn get(&self, key: &str) -> Option<&String> { - self.config.get(key) - } - - fn set(&mut self, key: String, value: String) { - self.config.insert(key, value); - } - - fn save(&self) -> Result<(), io::Error> { - let config_str = format_config(&self.config); - fs::write("config.toml", config_str) - } -} - -fn get_config() -> Arc> { - static mut SINGLETON: Option>> = None; - static ONCE: Once = Once::new(); - - unsafe { - ONCE.call_once(|| { - match ConfigManager::new() { - Ok(config) => { - SINGLETON = Some(Arc::new(Mutex::new(config))); - } - Err(e) => { - eprintln!("Failed to initialize ConfigManager: {}", e); - std::process::exit(1); - } - } - }); - - SINGLETON.clone().unwrap() - } -} - -fn parse_config(config_str: &str) -> HashMap { - config_str - .lines() - .filter_map(|line| { - let parts: Vec<&str> = line.splitn(2, '=').collect(); - if parts.len() == 2 { - Some((parts[0].trim().to_string(), parts[1].trim().to_string())) - } else { - None - } - }) - .collect() -} - -fn format_config(config: &HashMap) -> String { - let mut keys: Vec<&String> = config.keys().collect(); - keys.sort(); - keys.iter() - .map(|k| format!("{} = {}", k, config.get(*k).unwrap())) - .collect::>() - .join("\n") -} - - -fn main() -> Result<(), Box> { - let handles: Vec<_> = (0..3) - .map(|i| { - thread::spawn(move || { - let config = get_config(); - let mut config = config.lock().unwrap(); - - let db_url = config.get("database_url").cloned().unwrap_or_default(); - println!("Thread {} read database_url: {}", i, db_url); - - let new_value = format!("new_value_from_thread_{}", i); - config.set(format!("key_from_thread_{}", i), new_value.clone()); - println!("Thread {} set new value: {}", i, new_value); - - thread::sleep(std::time::Duration::from_millis(100)); - }) - }) - .collect(); - - for handle in handles { - handle.join().unwrap(); - } - - let config = get_config(); - let config = config.lock().unwrap(); - config.save()?; - println!("Configuration saved."); - - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_parse_config() { - let config_str = "key1 = value1\nkey2 = value2\nkey3 = value3"; - let config = parse_config(config_str); - assert_eq!(config.len(), 3); - assert_eq!(config.get("key1"), Some(&"value1".to_string())); - assert_eq!(config.get("key2"), Some(&"value2".to_string())); - assert_eq!(config.get("key3"), Some(&"value3".to_string())); - } - - #[test] - fn test_format_config() { - let mut config = HashMap::new(); - config.insert("key1".to_string(), "value1".to_string()); - config.insert("key2".to_string(), "value2".to_string()); - config.insert("key3".to_string(), "value3".to_string()); - - let config_str = format_config(&config); - assert_eq!(config_str, "key1 = value1\nkey2 = value2\nkey3 = value3"); - } -} \ No newline at end of file diff --git a/Module01/error/Cargo.lock b/Module01/error/Cargo.lock deleted file mode 100644 index 6524841f..00000000 --- a/Module01/error/Cargo.lock +++ /dev/null @@ -1,223 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "colored" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" -dependencies = [ - "lazy_static", - "windows-sys", -] - -[[package]] -name = "error" -version = "0.1.0" -dependencies = [ - "colored", - "rand", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "syn" -version = "2.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Module02/Web1/src/main.rs b/Module02/Web1/src/main.rs index eb228ffa..ab415854 100644 --- a/Module02/Web1/src/main.rs +++ b/Module02/Web1/src/main.rs @@ -21,10 +21,10 @@ mod tests { #[actix_rt::test] async fn test_intro() { let mut app = test::init_service(App::new().service(intro)).await; - + println!("server running"); let req = test::TestRequest::get().uri("/").to_request(); let resp = test::call_service(&mut app, req).await; - + assert_eq!(resp.status(), StatusCode::OK); } } diff --git a/Module02/Web2/Readme.md b/Module02/Web2/Readme.md index 8552e8b9..2a6238cc 100644 --- a/Module02/Web2/Readme.md +++ b/Module02/Web2/Readme.md @@ -56,6 +56,11 @@ cargo test The tests cover the server routes and error handling. +## Siege Test Result + +![alt text](image.png) + + ## License This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. diff --git a/Module02/Web2/image.png b/Module02/Web2/image.png new file mode 100644 index 00000000..826f78c6 Binary files /dev/null and b/Module02/Web2/image.png differ diff --git a/Module02/Web2/src/main.rs b/Module02/Web2/src/main.rs index 719f563a..21031bef 100644 --- a/Module02/Web2/src/main.rs +++ b/Module02/Web2/src/main.rs @@ -23,6 +23,7 @@ async fn echo(info: web::Json) -> impl Responder { #[actix_web::main] async fn main() -> std::io::Result<()> { + println!("Server starts running .... "); HttpServer::new(|| App::new().service(intro).service(greet).service(echo)) .bind("127.0.0.1:5500")? .run() diff --git a/Module02/auth_server/Cargo.toml b/Module02/auth_server/Cargo.toml index 8ab4ae13..e5c032db 100644 --- a/Module02/auth_server/Cargo.toml +++ b/Module02/auth_server/Cargo.toml @@ -9,4 +9,4 @@ jsonwebtoken = "7.2" serde = { version = "1.0", features = ["derive"]} serde_json = "1.0" tokio = { version = "1.0", features = ["full"] } -chrono = "0.4.38"o +chrono = "0.4.38" diff --git a/DesignModule04/PaymentProcessor/.gitignore b/Module04/PaymentProcessor/.gitignore similarity index 100% rename from DesignModule04/PaymentProcessor/.gitignore rename to Module04/PaymentProcessor/.gitignore diff --git a/DesignModule04/PaymentProcessor/Cargo.toml b/Module04/PaymentProcessor/Cargo.toml similarity index 100% rename from DesignModule04/PaymentProcessor/Cargo.toml rename to Module04/PaymentProcessor/Cargo.toml diff --git a/DesignModule04/StockMarket/Cargo.toml b/Module04/StockMarket/Cargo.toml similarity index 100% rename from DesignModule04/StockMarket/Cargo.toml rename to Module04/StockMarket/Cargo.toml diff --git a/DesignModule04/StockMarket/Observer.jpg b/Module04/StockMarket/Observer.jpg similarity index 100% rename from DesignModule04/StockMarket/Observer.jpg rename to Module04/StockMarket/Observer.jpg diff --git a/DesignModule04/StockMarket/notion_checklist.json b/Module04/StockMarket/notion_checklist.json similarity index 100% rename from DesignModule04/StockMarket/notion_checklist.json rename to Module04/StockMarket/notion_checklist.json diff --git a/DesignModule04/config_man/Cargo.toml b/Module04/config_man/Cargo.toml similarity index 100% rename from DesignModule04/config_man/Cargo.toml rename to Module04/config_man/Cargo.toml diff --git a/DesignModule04/config_man/Singleton.jpg b/Module04/config_man/Singleton.jpg similarity index 100% rename from DesignModule04/config_man/Singleton.jpg rename to Module04/config_man/Singleton.jpg diff --git a/DesignModule04/config_man/config.toml b/Module04/config_man/config.toml similarity index 100% rename from DesignModule04/config_man/config.toml rename to Module04/config_man/config.toml diff --git a/DesignModule04/config_man/src/config.toml b/Module04/config_man/src/config.toml similarity index 100% rename from DesignModule04/config_man/src/config.toml rename to Module04/config_man/src/config.toml