-
Notifications
You must be signed in to change notification settings - Fork 15
Week 3 day 3 #13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Week 3 day 3 #13
Changes from all commits
8ebbcb3
3eefd82
57f9c74
14de3ba
fc1e777
039b0d9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| /target |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| [package] | ||
| name = "Stephen-Ngozi-User-Input" | ||
| version = "0.1.0" | ||
| edition = "2024" | ||
|
|
||
| [dependencies] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
|
|
||
| use std::io; | ||
| enum PowerStatus { | ||
| Off, | ||
| Sleep, | ||
| Reboot, | ||
| Shutdown, | ||
| Hibernate, | ||
| } | ||
|
|
||
| fn format_power_status(input: &str) -> Option<PowerStatus> { | ||
| match input.to_lowercase().as_str() { | ||
| "off" => Some(PowerStatus::Off), | ||
| "sleep" => Some(PowerStatus::Sleep), | ||
| "reboot" => Some(PowerStatus::Reboot), | ||
| "shutdown" => Some(PowerStatus::Shutdown), | ||
| "hibernate" => Some(PowerStatus::Hibernate), | ||
| _ => None, | ||
| } | ||
| } | ||
|
|
||
|
|
||
| fn handle_power_status(status: PowerStatus) { | ||
| match status { | ||
| PowerStatus::Off => println!("Turning off the computer"), | ||
| PowerStatus::Sleep => println!("Putting the computer to sleep"), | ||
| PowerStatus::Reboot => println!("Rebooting the computer"), | ||
| PowerStatus::Shutdown => println!("Shutting down the computer"), | ||
| PowerStatus::Hibernate => println!("Hibernating the computer"), | ||
| } | ||
| } | ||
|
|
||
|
|
||
|
|
||
| fn main() { | ||
| println!("Enter power option (off, sleep, reboot, shutdown, hibernate):"); | ||
|
|
||
| let mut input = String::new(); | ||
| io::stdin() | ||
| .read_line(&mut input) | ||
| .expect("Failed to read input"); | ||
|
|
||
| let input = input.trim(); | ||
|
|
||
| match format_power_status(input) { | ||
| Some(status) => handle_power_status(status), | ||
| None => println!("Error: Invalid power option"), | ||
| } | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| /target |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| [package] | ||
| name = "Stephen-Ngozi-Merkle-Tree" | ||
| version = "0.1.0" | ||
| edition = "2024" | ||
|
|
||
| [dependencies] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
|
|
||
|
|
||
| #[derive(Debug, Clone)] | ||
| pub enum TransactionType { | ||
| Credit, | ||
| Debit, | ||
| } | ||
|
|
||
|
|
||
|
|
||
| #[derive(Debug, Clone)] | ||
| pub struct Expense { | ||
| pub id: u8, | ||
| pub name: String, | ||
| pub amount: f64, | ||
| pub tx_type: TransactionType, | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,141 @@ | ||||||||||
| mod expense; | ||||||||||
| mod tracker; | ||||||||||
|
|
||||||||||
| use std::io; | ||||||||||
| use expense::TransactionType; | ||||||||||
| use tracker::ExpenseTracker; | ||||||||||
|
|
||||||||||
|
|
||||||||||
|
|
||||||||||
|
|
||||||||||
| fn print_menu() { | ||||||||||
| println!("\n=== Expense Tracker ==="); | ||||||||||
| println!("1 - Add Expense"); | ||||||||||
| println!("2 - View Expenses"); | ||||||||||
| println!("3 - Update Expense"); | ||||||||||
| println!("4 - Delete Expense"); | ||||||||||
| println!("q - Quit"); | ||||||||||
| } | ||||||||||
| fn main() { | ||||||||||
| // println!("Hello, world!"); | ||||||||||
|
|
||||||||||
| let mut tracker = ExpenseTracker::new(); | ||||||||||
|
|
||||||||||
| loop { | ||||||||||
| print_menu(); | ||||||||||
|
|
||||||||||
| let mut input = String::new(); | ||||||||||
| io::stdin().read_line(&mut input).expect("Failed"); | ||||||||||
| let input = input.trim(); | ||||||||||
|
|
||||||||||
|
|
||||||||||
| if input == "q" { | ||||||||||
| println!("Are you sure you want to quit? (y/n)"); | ||||||||||
| let mut confirm = String::new(); | ||||||||||
| io::stdin().read_line(&mut confirm).expect("Failed "); | ||||||||||
| let confirm = confirm.trim(); | ||||||||||
|
|
||||||||||
| if confirm == "y" { | ||||||||||
| tracker.save_to_file("stephen_expences.txt"); | ||||||||||
| println!("Data saved to stephen_expences.txt"); | ||||||||||
|
Comment on lines
+39
to
+40
|
||||||||||
| tracker.save_to_file("stephen_expences.txt"); | |
| println!("Data saved to stephen_expences.txt"); | |
| tracker.save_to_file("stephen_expenses.txt"); | |
| println!("Data saved to stephen_expenses.txt"); |
Copilot
AI
Feb 12, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in output label: "Naria" is likely meant to be "Naira".
Copilot
AI
Feb 12, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in prompt: "Expence" should be "Expense".
Copilot
AI
Feb 12, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in status message: "Successfu" should be "Successful" (or "Successfully").
| println!("Expense Updated Successfu"); | |
| println!("Expense Updated Successfully"); |
Copilot
AI
Feb 12, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If tracker.update(...) returns false (ID not found), the user gets no feedback and the program silently continues. Add an else branch to print a not-found message (similar to delete).
Copilot
AI
Feb 12, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in status message: "Expence" should be "Expense".
| println!(" Your Expence is Deleted "); | |
| println!(" Your Expense is Deleted "); |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,84 @@ | ||||||
| use std::{collections::HashMap,fs::File,io::Write}; | ||||||
| use crate::expense::{Expense, TransactionType}; | ||||||
|
|
||||||
|
|
||||||
| // Expense tracker | ||||||
| // Add the expenses | ||||||
| // Remove | ||||||
| // Update | ||||||
| // View | ||||||
|
|
||||||
| // Hashmaps | ||||||
| // structs | ||||||
| // enums | ||||||
| // Hashmaps | ||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
| pub struct ExpenseTracker { | ||||||
| pub values: HashMap<u8, Expense>, | ||||||
| pub next_id: u8, | ||||||
| } | ||||||
|
|
||||||
| impl ExpenseTracker { | ||||||
| pub fn new() -> Self { | ||||||
| Self { | ||||||
| values: HashMap::new(), | ||||||
| next_id: 1, | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| pub fn add(&mut self, name: String, amount: f64, tx_type: TransactionType) -> Expense { | ||||||
| let current_id = self.next_id; | ||||||
| let new_expense = Expense { | ||||||
| id: current_id, | ||||||
| name, | ||||||
| amount, | ||||||
| tx_type, | ||||||
| }; | ||||||
| self.values.insert(current_id, new_expense.clone()); | ||||||
| self.next_id += 1; | ||||||
| new_expense | ||||||
| } | ||||||
|
|
||||||
| pub fn view_all(&self) -> Vec<&Expense> { | ||||||
| let mut expenses: Vec<&Expense> = self.values.values().collect(); | ||||||
|
|
||||||
| expenses.sort_by(|a, b|{a.id.cmp(&b.id)}); | ||||||
| expenses | ||||||
|
|
||||||
| } | ||||||
|
|
||||||
| pub fn update(&mut self, id: u8, amount: f64, tx_type: TransactionType) -> bool { | ||||||
| match self.values.get_mut(&id) { | ||||||
| Some(exp) => { | ||||||
| exp.amount = amount; | ||||||
| exp.tx_type = tx_type; | ||||||
| true | ||||||
| } | ||||||
| None => false, | ||||||
| } | ||||||
| // let updated_expense = Expense { | ||||||
| // id, | ||||||
| // amount, | ||||||
| // tx_type, | ||||||
| // }; | ||||||
| // self.values.put(id) | ||||||
| } | ||||||
|
|
||||||
| pub fn delete(&mut self, id: u8) -> bool { | ||||||
| self.values.remove(&id).is_some() | ||||||
| } | ||||||
|
|
||||||
|
|
||||||
| pub fn save_to_file(&self, filename: &str) { | ||||||
| let mut file = File::create(filename).expect("Could not create file"); | ||||||
|
Comment on lines
+75
to
+76
|
||||||
|
|
||||||
| for expense in self.values.values() { | ||||||
|
||||||
| for expense in self.values.values() { | |
| for expense in self.view_all().iter() { |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| ID: 2, Name: Beans, Amount: 5000.00, Type: Credit | ||
| ID: 1, Name: Rice, Amount: 20000.00, Type: Credit |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| /target |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| [package] | ||
| name = "stephenngozi-build-cli-project" | ||
| version = "0.1.0" | ||
| edition = "2024" | ||
|
|
||
| [dependencies] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| searching for to | ||
| In File poem.txt | ||
| Are you nobody, too? | ||
| How dreary to be somebody! |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| I'm nobody! Who are you? | ||
| Are you nobody, too? | ||
| Then there's a pair of us - don't tell! | ||
| They'd banish us, you know. | ||
|
|
||
| How dreary to be somebody! | ||
| How public, like a frog | ||
| To tell your name the livelong day | ||
| To an admiring bog! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR description says this is a Week 3 Day 3 submission, but this PR also adds Week 2 Day 3 / Day 5 projects. Per the repo submission guidance, week/day submissions should be kept scoped to the relevant folder; consider moving Week 2 additions into separate PR(s).