From e8ae8c3eac297da5986dd14c892783d0bc79fae2 Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 03:16:52 +0000 Subject: [PATCH 1/9] version1 --- .../yahia008/student_registry-V1/Cargo.lock | 7 ++ .../yahia008/student_registry-V1/Cargo.toml | 6 ++ .../yahia008/student_registry-V1/src/grade.rs | 31 +++++++++ .../yahia008/student_registry-V1/src/main.rs | 43 ++++++++++++ .../student_registry-V1/src/registry.rs | 69 +++++++++++++++++++ .../src/registry_struct.rs | 6 ++ .../student_registry-V1/src/student_struct.rs | 42 +++++++++++ .../yahia008/student_registry-V1/src/utils.rs | 3 + 8 files changed, 207 insertions(+) create mode 100644 rust_session/yahia008/student_registry-V1/Cargo.lock create mode 100644 rust_session/yahia008/student_registry-V1/Cargo.toml create mode 100644 rust_session/yahia008/student_registry-V1/src/grade.rs create mode 100644 rust_session/yahia008/student_registry-V1/src/main.rs create mode 100644 rust_session/yahia008/student_registry-V1/src/registry.rs create mode 100644 rust_session/yahia008/student_registry-V1/src/registry_struct.rs create mode 100644 rust_session/yahia008/student_registry-V1/src/student_struct.rs create mode 100644 rust_session/yahia008/student_registry-V1/src/utils.rs diff --git a/rust_session/yahia008/student_registry-V1/Cargo.lock b/rust_session/yahia008/student_registry-V1/Cargo.lock new file mode 100644 index 00000000..25893481 --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "student_registry-V1" +version = "0.1.0" diff --git a/rust_session/yahia008/student_registry-V1/Cargo.toml b/rust_session/yahia008/student_registry-V1/Cargo.toml new file mode 100644 index 00000000..0eedbc73 --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "student_registry-V1" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/rust_session/yahia008/student_registry-V1/src/grade.rs b/rust_session/yahia008/student_registry-V1/src/grade.rs new file mode 100644 index 00000000..10438b1e --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/src/grade.rs @@ -0,0 +1,31 @@ +#[derive(Debug, PartialEq)] +pub enum Grade { + First, + Second, + Third, +} + +impl Grade { + pub fn as_str(&self) -> &str { + match self { + Grade::First => "Cohort 1", + Grade::Second => "Cohort 2", + Grade::Third => "Cohort 3", + } + } +} + +#[derive(Debug)] +pub enum Sex { + Male, + Female, +} + +impl Sex { + pub fn to_str(&self) { + match self { + Sex::Male => println!("male: šŸ‘ØšŸ¾"), + Sex::Female => println!("female: šŸ‘§šŸ¾"), + } + } +} diff --git a/rust_session/yahia008/student_registry-V1/src/main.rs b/rust_session/yahia008/student_registry-V1/src/main.rs new file mode 100644 index 00000000..de079fc8 --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/src/main.rs @@ -0,0 +1,43 @@ +mod grade; +mod registry; +mod student_struct; + + +use grade::{Grade, Sex}; +use registry::Registry; +use student_struct::Student; + +fn main() { + // let g = Grade::Second; + // println!("{}", g.as_str()); // "2nd Year" + // println!("{:?}", g); + + // let ss = Student::new(); + // println!("stund") + + // let mut reg = Registry::new(); + + // reg.add("Victor", 20, Grade::First, 78.5); + // reg.add("Kosi", 22, Grade::Second, 64.0); + // reg.add("Yusrah", 21, Grade::First, 91.0); + + // reg.list_all();] + + let sex = Sex::Male; + println!("sex: {:?}", sex.to_str()); + + // let s: Student = Student::new(1, String::from("Testimony"), 16, Sex::Female, Grade::Third, 40.5); + let s: Student = Student::new( + 1, + "Testimony".to_string(), + 16, + Sex::Female, + Grade::Third, + 40.5, + ); + println!("student here: {:#?}", s); + + println!("student id: {}", s.id); + println!("student name: {}", s.name); + println!("student age: {}", s.age); +} diff --git a/rust_session/yahia008/student_registry-V1/src/registry.rs b/rust_session/yahia008/student_registry-V1/src/registry.rs new file mode 100644 index 00000000..44155080 --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/src/registry.rs @@ -0,0 +1,69 @@ +use crate::grade::{Grade, Sex}; +use crate::student_struct::Student; + +pub struct Registry { + pub students: Vec, + next_id: u32, +} + +impl Registry { + pub fn add(&mut self, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) { + let id = self.next_id; + let student = Student::new(id, name.to_string(), age, sex, grade, score); + println!("Added: {} (ID {})", student.name, student.id); + self.students.push(student); + self.next_id += 1; + } + + pub fn list_all(&self) { + if self.students.is_empty() { + println!(" (no students enrolled yet)"); + return; + } + println!( + " {:>5} {:<20} {:<6} {:<10} {}", + "ID", "Name", "Age", "Grade", "Score" + ); + println!(" {}", "-".repeat(55)); + for student in &self.students { + println!( + " {:>5} {:<20} {:>6} {:<10} {:.1}", + student.id, + student.name, + student.age, + student.grade.as_str(), + student.score, + ); + } + } + + + + pub fn find_by_id(&mut self, id: u8) -> Option<&mut Student> { + self.students.iter().find(|student| student.id == id) + } + + pub fn update(&mut self, id:u8, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) -> Option<&mut Student> { + if let Some(student) = self.find_by_id_mut(id) { + student.name = name.to_string(); + student.age = age; + student.sex = sex; + student.grade = grade; + student.score = score; + Some(student) + } else { + None + } + } + + pub fn delete(&mut self, id: u8) -> Option { + let position = self.students.iter().position(|student| student.id == id); + + match position { + Some(index) => Some(self.students.remove(index)), + None => None, + } + } + + +} diff --git a/rust_session/yahia008/student_registry-V1/src/registry_struct.rs b/rust_session/yahia008/student_registry-V1/src/registry_struct.rs new file mode 100644 index 00000000..8b076a03 --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/src/registry_struct.rs @@ -0,0 +1,6 @@ +use crate::student_struct; + +pub struct Registry { + students: Vec, // Vec = "a list of Student values" + next_id: u32, // auto-increment counter for IDs +} \ No newline at end of file diff --git a/rust_session/yahia008/student_registry-V1/src/student_struct.rs b/rust_session/yahia008/student_registry-V1/src/student_struct.rs new file mode 100644 index 00000000..9e4ead64 --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/src/student_struct.rs @@ -0,0 +1,42 @@ +use crate::grade::{Grade, Sex}; + +// A struct groups related pieces of data under one name. +// Think of it as a custom data type you design yourself. + +#[derive(Debug)] +pub struct Student { + pub id: u32, // u32 = unsigned 32-bit integer (no negatives) + pub name: String, // String = heap-allocated, growable text + pub age: u8, + pub sex: Sex, + pub grade: Grade, // our own enum type from above + pub score: f32, +} + +// This is the implementation of the student struct with its corresponding methods +impl Student { + pub fn new(id: u32, name: String, age: u8, sex: Sex, grade: Grade, score: f32) -> Student { + Student { + id, + name, + age, + sex, + grade, + score, + } + } +} + +#[derive(Debug)] +pub enum Status { + Pending, + Ongoing, + Completed, +} + +pub struct Todo { + id: u8, + title: String, + description: String, + status: Status, +} diff --git a/rust_session/yahia008/student_registry-V1/src/utils.rs b/rust_session/yahia008/student_registry-V1/src/utils.rs new file mode 100644 index 00000000..006e5e9d --- /dev/null +++ b/rust_session/yahia008/student_registry-V1/src/utils.rs @@ -0,0 +1,3 @@ +pub find_id(&self, id:u8)-> Option<&self> { + self.students.iter().find(|u| u.id == id) +} \ No newline at end of file From 20902da1b3638e91926a81dff8d49466d315e5ef Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 03:23:48 +0000 Subject: [PATCH 2/9] version1 --- .../yahia008/student_registry-V1/src/registry.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rust_session/yahia008/student_registry-V1/src/registry.rs b/rust_session/yahia008/student_registry-V1/src/registry.rs index 44155080..95a7c040 100644 --- a/rust_session/yahia008/student_registry-V1/src/registry.rs +++ b/rust_session/yahia008/student_registry-V1/src/registry.rs @@ -39,12 +39,12 @@ impl Registry { - pub fn find_by_id(&mut self, id: u8) -> Option<&mut Student> { - self.students.iter().find(|student| student.id == id) + pub fn find_by_id(&mut self, id: u32) -> Option<&mut Student> { + self.students.iter_mut().find(|student| student.id == id) } - pub fn update(&mut self, id:u8, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) -> Option<&mut Student> { - if let Some(student) = self.find_by_id_mut(id) { + pub fn update(&mut self, id:u32, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) -> Option<&mut Student> { + if let Some(student) = self.find_by_id(id) { student.name = name.to_string(); student.age = age; student.sex = sex; @@ -56,7 +56,7 @@ impl Registry { } } - pub fn delete(&mut self, id: u8) -> Option { + pub fn delete(&mut self, id: u32) -> Option { let position = self.students.iter().position(|student| student.id == id); match position { From 12815bf383b1ca241530593f7d8a20d98dbfb91d Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 09:08:33 +0000 Subject: [PATCH 3/9] version1 --- .../yahia008/student_registry-V1/src/main.rs | 68 ++++++++++--------- .../student_registry-V1/src/registry.rs | 2 +- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/rust_session/yahia008/student_registry-V1/src/main.rs b/rust_session/yahia008/student_registry-V1/src/main.rs index de079fc8..18634ee5 100644 --- a/rust_session/yahia008/student_registry-V1/src/main.rs +++ b/rust_session/yahia008/student_registry-V1/src/main.rs @@ -8,36 +8,40 @@ use registry::Registry; use student_struct::Student; fn main() { - // let g = Grade::Second; - // println!("{}", g.as_str()); // "2nd Year" - // println!("{:?}", g); - - // let ss = Student::new(); - // println!("stund") - - // let mut reg = Registry::new(); - - // reg.add("Victor", 20, Grade::First, 78.5); - // reg.add("Kosi", 22, Grade::Second, 64.0); - // reg.add("Yusrah", 21, Grade::First, 91.0); - - // reg.list_all();] - - let sex = Sex::Male; - println!("sex: {:?}", sex.to_str()); - - // let s: Student = Student::new(1, String::from("Testimony"), 16, Sex::Female, Grade::Third, 40.5); - let s: Student = Student::new( - 1, - "Testimony".to_string(), - 16, - Sex::Female, - Grade::Third, - 40.5, - ); - println!("student here: {:#?}", s); - - println!("student id: {}", s.id); - println!("student name: {}", s.name); - println!("student age: {}", s.age); + let mut registry = Registry { + students: Vec::new(), + next_id: 0, + }; + + registry.add("yusrah", 20, Sex::Female, Grade::First, 85.5); + registry.add("Dave", 22, Sex::Male, Grade::Second, 92.0); + registry.add("basongs", 19, Sex::Male, Grade::Third, 78.5); + + println!("\nAll students:"); + registry.list_all(); + + + println!("\nUpdating student with ID 1..."); + if let Some(student) = registry.update(0, "jiggs", 21, Sex::Male, Grade::Second, 88.0) { + println!("Updated: {} (ID {})", student.name, student.id); + } else { + println!("Student not found"); + } + + println!("\nAfter update:"); + registry.list_all(); + + println!("\nFinding student with ID 2..."); + if let Some(student) = registry.find_by_id(2) { + println!("Found: {} (ID {}, Age: {})", student.name, student.id, student.age); + } + + println!("\nDeleting student with ID 2..."); + if let Some(deleted) = registry.delete(2) { + println!("Deleted: {} (ID {})", deleted.name, deleted.id); + } + + println!("\nAfter deletion:"); + registry.list_all(); + } diff --git a/rust_session/yahia008/student_registry-V1/src/registry.rs b/rust_session/yahia008/student_registry-V1/src/registry.rs index 95a7c040..a6b6e155 100644 --- a/rust_session/yahia008/student_registry-V1/src/registry.rs +++ b/rust_session/yahia008/student_registry-V1/src/registry.rs @@ -3,7 +3,7 @@ use crate::student_struct::Student; pub struct Registry { pub students: Vec, - next_id: u32, + pub next_id: u32, } impl Registry { From 1a541b5575e7e70ca052b20f857e7f6f1bbae75c Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:14:05 +0000 Subject: [PATCH 4/9] version2 --- .../yahia008/student_registry_v2/.gitignore | 1 + .../yahia008/student_registry_v2/Cargo.lock | 500 ++++++++++++++++++ .../yahia008/student_registry_v2/Cargo.toml | 7 + .../yahia008/student_registry_v2/src/grade.rs | 31 ++ .../yahia008/student_registry_v2/src/main.rs | 61 +++ .../student_registry_v2/src/registry.rs | 116 ++++ .../src/registry_struct.rs | 7 + .../student_registry_v2/src/student_struct.rs | 42 ++ 8 files changed, 765 insertions(+) create mode 100644 rust_session/yahia008/student_registry_v2/.gitignore create mode 100644 rust_session/yahia008/student_registry_v2/Cargo.lock create mode 100644 rust_session/yahia008/student_registry_v2/Cargo.toml create mode 100644 rust_session/yahia008/student_registry_v2/src/grade.rs create mode 100644 rust_session/yahia008/student_registry_v2/src/main.rs create mode 100644 rust_session/yahia008/student_registry_v2/src/registry.rs create mode 100644 rust_session/yahia008/student_registry_v2/src/registry_struct.rs create mode 100644 rust_session/yahia008/student_registry_v2/src/student_struct.rs diff --git a/rust_session/yahia008/student_registry_v2/.gitignore b/rust_session/yahia008/student_registry_v2/.gitignore new file mode 100644 index 00000000..9f970225 --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/rust_session/yahia008/student_registry_v2/Cargo.lock b/rust_session/yahia008/student_registry_v2/Cargo.lock new file mode 100644 index 00000000..a4be051f --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/Cargo.lock @@ -0,0 +1,500 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "student_registry_v2" +version = "0.1.0" +dependencies = [ + "uuid", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "uuid" +version = "1.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +dependencies = [ + "getrandom", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/rust_session/yahia008/student_registry_v2/Cargo.toml b/rust_session/yahia008/student_registry_v2/Cargo.toml new file mode 100644 index 00000000..6f08d669 --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "student_registry_v2" +version = "0.1.0" +edition = "2024" + +[dependencies] +uuid = {version ="1", features = ["v4"]} \ No newline at end of file diff --git a/rust_session/yahia008/student_registry_v2/src/grade.rs b/rust_session/yahia008/student_registry_v2/src/grade.rs new file mode 100644 index 00000000..10438b1e --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/src/grade.rs @@ -0,0 +1,31 @@ +#[derive(Debug, PartialEq)] +pub enum Grade { + First, + Second, + Third, +} + +impl Grade { + pub fn as_str(&self) -> &str { + match self { + Grade::First => "Cohort 1", + Grade::Second => "Cohort 2", + Grade::Third => "Cohort 3", + } + } +} + +#[derive(Debug)] +pub enum Sex { + Male, + Female, +} + +impl Sex { + pub fn to_str(&self) { + match self { + Sex::Male => println!("male: šŸ‘ØšŸ¾"), + Sex::Female => println!("female: šŸ‘§šŸ¾"), + } + } +} diff --git a/rust_session/yahia008/student_registry_v2/src/main.rs b/rust_session/yahia008/student_registry_v2/src/main.rs new file mode 100644 index 00000000..d5dc0213 --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/src/main.rs @@ -0,0 +1,61 @@ +mod grade; +mod registry; +mod student_struct; + + +use grade::{Grade, Sex}; +use registry::Registry; +use student_struct::Student; +use uuid::Uuid; +fn main() { + let mut registry = Registry { + students: Vec::new(), + + }; + + registry.add("yusrah", 20, Sex::Female, Grade::First, 85.5); + registry.add("Dave", 22, Sex::Male, Grade::Second, 92.0); + registry.add("basongs", 19, Sex::Male, Grade::Third, 78.5); + + println!("\nAll students:"); + registry.list_all(); + + let first_student_id = registry.students[0].id; + + + println!("\nUpdating student with ID {}...", first_student_id); + if let Some(student) = registry.update(first_student_id, "pragon", 16, Sex::Female, Grade::Second, 88.0) { + println!("Updated: {} (ID {})", student.name, student.id); + } else { + println!("Student not found"); + } + + println!("\nAfter update:"); + registry.list_all(); + + println!("\nFinding student by ID..."); + if let Some(student) = registry.find_by_id(first_student_id) { + println!("Found: {} (ID {}, Age: {})", student.name, student.id, student.age); + } + + let second_student_id = registry.students[1].id; + println!("\nDeleting student with ID {}...", second_student_id); + if let Some(deleted) = registry.delete(second_student_id) { + println!("Deleted: {} (ID {})", deleted.name, deleted.id); + } + + + println!("\nAfter deletion:"); + registry.list_all(); + + let specific_uuid = Uuid::new_v4(); + println!("\nTrying to find non-existent student with UUID {}...", specific_uuid); + if let Some(student) = registry.find_by_id(specific_uuid) { + println!("Found: {}", student.name); + } else { + println!("No student found with that UUID"); + } + + + +} \ No newline at end of file diff --git a/rust_session/yahia008/student_registry_v2/src/registry.rs b/rust_session/yahia008/student_registry_v2/src/registry.rs new file mode 100644 index 00000000..c55da869 --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/src/registry.rs @@ -0,0 +1,116 @@ +use crate::grade::{Grade, Sex}; +use crate::student_struct::Student; +use uuid::Uuid; + +pub struct Registry { + pub students: Vec, + +} + +impl Registry { + pub fn add(&mut self, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) { + let student = Student::new(name.to_string(), age, sex, grade, score); + println!("Added: {} (ID {})", student.name, student.id); + self.students.push(student); + + } + + pub fn list_all(&self) { + if self.students.is_empty() { + println!(" (no students enrolled yet)"); + return; + } + println!( + " {:>5} {:<20} {:<6} {:<10} {}", + "ID", "Name", "Age", "Grade", "Score" + ); + println!(" {}", "-".repeat(55)); + for student in &self.students { + println!( + " {:>5} {:<20} {:>6} {:<10} {:.1}", + student.id, + student.name, + student.age, + student.grade.as_str(), + student.score, + ); + } + } + + + + pub fn find_by_id(&mut self, id:Uuid) -> Option<&mut Student> { + self.students.iter_mut().find(|student| student.id == id) + } + + pub fn update(&mut self, id:Uuid, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) -> Option<&mut Student> { + if let Some(student) = self.find_by_id(id) { + student.name = name.to_string(); + student.age = age; + student.sex = sex; + student.grade = grade; + student.score = score; + Some(student) + } else { + None + } + } + + + pub fn update_age(&mut self, id: Uuid, new_age: u8) -> Option<()> { + if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + student.age = new_age; + println!("Updated age for student ID {}", id); + Some(()) + } else { + println!("Student with ID {} not found", id); + None + } + } + + pub fn update_name(&mut self, id: Uuid, new_name: String) -> Option<()> { + if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + student.name = new_name; + println!("Updated name for student ID {}", id); + Some(()) + } else { + println!("Student with ID {} not found", id); + None + } + } + + #[allow(dead_code)] + pub fn update_sex(&mut self, id: Uuid, new_sex: Sex) -> Option<()> { + if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + student.sex = new_sex; + println!("Updated sex for student ID {}", id); + Some(()) + } else { + println!("Student with ID {} not found", id); + None + } + } + + #[allow(dead_code)] + pub fn update_grade(&mut self, id: Uuid, new_grade: Grade) -> Option<()> { + if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + student.grade = new_grade; + println!("Updated grade for student ID {}", id); + Some(()) + } else { + println!("Student with ID {} not found", id); + None + } + } + + pub fn delete(&mut self, id: Uuid) -> Option { + let position = self.students.iter().position(|student| student.id == id); + + match position { + Some(index) => Some(self.students.remove(index)), + None => None, + } + } + + +} diff --git a/rust_session/yahia008/student_registry_v2/src/registry_struct.rs b/rust_session/yahia008/student_registry_v2/src/registry_struct.rs new file mode 100644 index 00000000..5bca0b02 --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/src/registry_struct.rs @@ -0,0 +1,7 @@ +use crate::student_struct; +use uuid::Uuid; + +pub struct Registry { + students: Vec, // Vec = "a list of Student values" + // auto-increment counter for IDs +} \ No newline at end of file diff --git a/rust_session/yahia008/student_registry_v2/src/student_struct.rs b/rust_session/yahia008/student_registry_v2/src/student_struct.rs new file mode 100644 index 00000000..06070ea8 --- /dev/null +++ b/rust_session/yahia008/student_registry_v2/src/student_struct.rs @@ -0,0 +1,42 @@ +use crate::grade::{Grade, Sex}; +use uuid::Uuid; +// A struct groups related pieces of data under one name. +// Think of it as a custom data type you design yourself. + +#[derive(Debug)] +pub struct Student { + pub id: Uuid, // u32 = unsigned 32-bit integer (no negatives) + pub name: String, // String = heap-allocated, growable text + pub age: u8, + pub sex: Sex, + pub grade: Grade, // our own enum type from above + pub score: f32, +} + +// This is the implementation of the student struct with its corresponding methods +impl Student { + pub fn new( name: String, age: u8, sex: Sex, grade: Grade, score: f32) -> Student { + Student { + id:Uuid::new_v4(), + name, + age, + sex, + grade, + score, + } + } +} + +#[derive(Debug)] +pub enum Status { + Pending, + Ongoing, + Completed, +} + +pub struct Todo { + id: u8, + title: String, + description: String, + status: Status, +} From 91b78a7e07ab15140c6f91c35c78aa62e112caf1 Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 11:20:01 +0000 Subject: [PATCH 5/9] version update --- .../yahia008/student_registry_v2/src/main.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/rust_session/yahia008/student_registry_v2/src/main.rs b/rust_session/yahia008/student_registry_v2/src/main.rs index d5dc0213..1d26f9bb 100644 --- a/rust_session/yahia008/student_registry_v2/src/main.rs +++ b/rust_session/yahia008/student_registry_v2/src/main.rs @@ -21,6 +21,11 @@ fn main() { registry.list_all(); let first_student_id = registry.students[0].id; + let second_student_id = registry.students[1].id; + let third_student_id = registry.students[2].id; + + + println!("\nUpdating student with ID {}...", first_student_id); @@ -33,12 +38,20 @@ fn main() { println!("\nAfter update:"); registry.list_all(); + println!("\nMaking multiple updates to first_student:"); + registry.update_name(first_student_id, "sami".to_string()); + registry.update_age(first_student_id, 32); + registry.update_grade(first_student_id, Grade::Third); + + println!("\nAfter multiple updates:"); + registry.list_all(); + println!("\nFinding student by ID..."); if let Some(student) = registry.find_by_id(first_student_id) { println!("Found: {} (ID {}, Age: {})", student.name, student.id, student.age); } - let second_student_id = registry.students[1].id; + println!("\nDeleting student with ID {}...", second_student_id); if let Some(deleted) = registry.delete(second_student_id) { println!("Deleted: {} (ID {})", deleted.name, deleted.id); From 734ee85e160d25592a8c7a524777ad6faf418249 Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:25:25 +0000 Subject: [PATCH 6/9] update --- .../student_registry_v2/src/registry.rs | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/rust_session/yahia008/student_registry_v2/src/registry.rs b/rust_session/yahia008/student_registry_v2/src/registry.rs index c55da869..ce28f047 100644 --- a/rust_session/yahia008/student_registry_v2/src/registry.rs +++ b/rust_session/yahia008/student_registry_v2/src/registry.rs @@ -59,9 +59,14 @@ impl Registry { pub fn update_age(&mut self, id: Uuid, new_age: u8) -> Option<()> { if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + if student.age == new_age { + println!("Name is already '{}', no update needed", student.age); + return Some(()); + } else { + println!("Updated age from '{}' to '{}'", student.age, new_age); student.age = new_age; - println!("Updated age for student ID {}", id); - Some(()) + return Some(()); + } } else { println!("Student with ID {} not found", id); None @@ -70,9 +75,15 @@ impl Registry { pub fn update_name(&mut self, id: Uuid, new_name: String) -> Option<()> { if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + if student.name == new_name { + println!("Name is already '{}', no update needed", student.name); + return Some(()); + } else { + println!("Updated name from '{}' to '{}'", student.name, new_name); student.name = new_name; - println!("Updated name for student ID {}", id); - Some(()) + return Some(()); + } + } else { println!("Student with ID {} not found", id); None @@ -94,9 +105,14 @@ impl Registry { #[allow(dead_code)] pub fn update_grade(&mut self, id: Uuid, new_grade: Grade) -> Option<()> { if let Some(student) = self.students.iter_mut().find(|s| s.id == id) { + if student.grade == new_grade { + println!("Grade is already , no update needed"); + return Some(()); + } else { + println!("Updated grade from to '{:?}'", new_grade); student.grade = new_grade; - println!("Updated grade for student ID {}", id); - Some(()) + return Some(()); + } } else { println!("Student with ID {} not found", id); None From 490c58af8a77b51e346c07d19eb42b70fb7d1968 Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Wed, 10 Jun 2026 13:40:53 +0000 Subject: [PATCH 7/9] update --- .../student_registry_v2/src/registry.rs | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/rust_session/yahia008/student_registry_v2/src/registry.rs b/rust_session/yahia008/student_registry_v2/src/registry.rs index ce28f047..c3733ef4 100644 --- a/rust_session/yahia008/student_registry_v2/src/registry.rs +++ b/rust_session/yahia008/student_registry_v2/src/registry.rs @@ -9,10 +9,40 @@ pub struct Registry { impl Registry { pub fn add(&mut self, name: &str, age: u8, sex: Sex, grade: Grade, score: f32) { + + if name.trim().is_empty() { + println!("Name cannot be empty"); + } + + if name.len() < 2 { + println!("Name must be at least 2 characters long"); + } + + if name.len() > 50 { + println!("Name cannot exceed 50 characters"); + } + + if age < 18 { + println!("Student must be at least 18 years old"); + } + + if age > 100 { + println!("Age cannot exceed 100 years"); + } + + + if score < 0.0 { + println!("Score cannot be negative"); + } + + if score > 100.0 { + println!("Score cannot exceed 100"); + } + + let student = Student::new(name.to_string(), age, sex, grade, score); println!("Added: {} (ID {})", student.name, student.id); - self.students.push(student); - + self.students.push(student); } pub fn list_all(&self) { From a9cbef924886907a953a17891d544a59b7e97b94 Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Thu, 11 Jun 2026 11:36:14 +0000 Subject: [PATCH 8/9] push --- rust_session/yahia008/minilib/Cargo.lock | 7 ++ rust_session/yahia008/minilib/Cargo.toml | 6 ++ rust_session/yahia008/minilib/src/library.rs | 106 +++++++++++++++++++ rust_session/yahia008/minilib/src/main.rs | 32 ++++++ rust_session/yahia008/minilib/src/member.rs | 25 +++++ 5 files changed, 176 insertions(+) create mode 100644 rust_session/yahia008/minilib/Cargo.lock create mode 100644 rust_session/yahia008/minilib/Cargo.toml create mode 100644 rust_session/yahia008/minilib/src/library.rs create mode 100644 rust_session/yahia008/minilib/src/main.rs create mode 100644 rust_session/yahia008/minilib/src/member.rs diff --git a/rust_session/yahia008/minilib/Cargo.lock b/rust_session/yahia008/minilib/Cargo.lock new file mode 100644 index 00000000..6a1dc09d --- /dev/null +++ b/rust_session/yahia008/minilib/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "minilib" +version = "0.1.0" diff --git a/rust_session/yahia008/minilib/Cargo.toml b/rust_session/yahia008/minilib/Cargo.toml new file mode 100644 index 00000000..60907256 --- /dev/null +++ b/rust_session/yahia008/minilib/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "minilib" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/rust_session/yahia008/minilib/src/library.rs b/rust_session/yahia008/minilib/src/library.rs new file mode 100644 index 00000000..d3d11a0d --- /dev/null +++ b/rust_session/yahia008/minilib/src/library.rs @@ -0,0 +1,106 @@ +use crate::member::Member; + +#[derive(Debug, Clone)] +pub struct Book { + pub title: String, + pub author: String, + pub available: bool, +} + +#[derive(Debug)] +pub struct Library { + pub books: Vec, +} + +impl Library { + pub fn new() -> Self { + Library { books: Vec::new() } + } + + + pub fn add_book(&mut self, title: String, author: String, available: bool) { + let new_book = Book { + title, + author, + available, + }; + self.books.push(new_book); + println!("āœ… Book added successfully!"); + } + + + pub fn list_books(&self) { + if self.books.is_empty() { + println!("šŸ“š No books in the library yet!"); + return; + } + + println!("\nšŸ“š Library Collection:"); + println!("{:<30} {:<25} {:<10}", "Title", "Author", "Available"); + println!("{}", "-".repeat(65)); + + for book in &self.books { + println!( + "{:<30} {:<25} {:<10}", + book.title, + book.author, + if book.available { "Yes" } else { "No" } + ); + } + } + + pub fn search_by_title(&self, title: &str) -> Option<&Book> { + self.books.iter().find(|book| book.title == title) + } + + + pub fn search_by_author(&self, author: &str) -> Vec<&Book> { + self.books.iter().filter(|book| book.author == author).collect() + } + + + pub fn checkout_book(&mut self, title: &str, member: &mut Member) -> bool { + if let Some(book) = self.books.iter_mut().find(|book| book.title == title) { + if book.available { + book.available = false; + member.borrowed_books.push(book.title.clone()); + println!("āœ… '{}' has been checked out by {}", title, member.name); + return true; + } else { + println!("āŒ '{}' is already checked out!", title); + return false; + } + } + println!("āŒ Book '{}' not found!", title); + false + } + + + pub fn return_book(&mut self, title: &str, member: &mut Member) -> bool { + if let Some(book) = self.books.iter_mut().find(|book| book.title == title) { + if !book.available { + book.available = true; + member.borrowed_books.retain(|b| b != title); + println!("āœ… '{}' has been returned by {}", title, member.name); + return true; + } else { + println!("āŒ '{}' wasn't checked out!", title); + return false; + } + } + println!("āŒ Book '{}' not found!", title); + false + } + + + pub fn display_book_info(&self, title: &str) { + if let Some(book) = self.search_by_title(title) { + println!("\nšŸ“– Book Details:"); + println!(" Title: {}", book.title); + println!(" Author: {}", book.author); + println!(" Status: {}", if book.available { "Available" } else { "Checked Out" }); + } else { + println!("āŒ Book '{}' not found!", title); + } + } +} \ No newline at end of file diff --git a/rust_session/yahia008/minilib/src/main.rs b/rust_session/yahia008/minilib/src/main.rs new file mode 100644 index 00000000..23a2a1a0 --- /dev/null +++ b/rust_session/yahia008/minilib/src/main.rs @@ -0,0 +1,32 @@ +mod library; +mod member; + +use library::Library; +use member::Member; + +fn main() { + let mut library = Library::new(); + let mut member = Member::new("rasputin".to_string()); + + library.add_book("48 laws of power".to_string(), "robert green".to_string(), true); + library.add_book("meditation".to_string(), "Machiavelli".to_string(), true); + library.add_book("thing fall apart".to_string(), "Chinua Achebe".to_string(), true); + library.add_book("romeo an julliet".to_string(), "William Shakespeare".to_string(), false); + + + library.list_books(); + + println!("\n--- Searching for 'Rust in Action' ---"); + if let Some(book) = library.search_by_title("meditation") { + println!("Found: {} by {}", book.title, book.author); + } + + println!("\n--- Searching for books by 'Machiavelli' ---"); + let books = library.search_by_author("Machiavelli"); + for book in books { + println!("Found: {}", book.title); + } + + + +} \ No newline at end of file diff --git a/rust_session/yahia008/minilib/src/member.rs b/rust_session/yahia008/minilib/src/member.rs new file mode 100644 index 00000000..b5ac1331 --- /dev/null +++ b/rust_session/yahia008/minilib/src/member.rs @@ -0,0 +1,25 @@ +#[derive(Debug)] +pub struct Member { + pub name: String, + pub borrowed_books: Vec, +} + +impl Member { + pub fn new(name: String) -> Self { + Member { + name, + borrowed_books: Vec::new(), + } + } + + pub fn list_borrowed_books(&self) { + if self.borrowed_books.is_empty() { + println!("{} hasn't borrowed any books.", self.name); + } else { + println!("\nšŸ“š {}'s Borrowed Books:", self.name); + for book in &self.borrowed_books { + println!(" - {}", book); + } + } + } +} \ No newline at end of file From 29174bd5b956eac08d7cf97c7bf8d73f99a068ca Mon Sep 17 00:00:00 2001 From: yahia008 <120284117+yahia008@users.noreply.github.com> Date: Fri, 12 Jun 2026 11:06:08 +0000 Subject: [PATCH 9/9] library management --- rust_session/yahia008/minilib/src/library.rs | 20 +++++++++---------- rust_session/yahia008/minilib/src/main.rs | 21 +++++++++++++++++++- rust_session/yahia008/minilib/src/member.rs | 2 +- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/rust_session/yahia008/minilib/src/library.rs b/rust_session/yahia008/minilib/src/library.rs index d3d11a0d..bba3da9f 100644 --- a/rust_session/yahia008/minilib/src/library.rs +++ b/rust_session/yahia008/minilib/src/library.rs @@ -25,17 +25,17 @@ impl Library { available, }; self.books.push(new_book); - println!("āœ… Book added successfully!"); + println!("Book added successfully!"); } pub fn list_books(&self) { if self.books.is_empty() { - println!("šŸ“š No books in the library yet!"); + println!(" No books in the library yet!"); return; } - println!("\nšŸ“š Library Collection:"); + println!("\nLibrary Collection:"); println!("{:<30} {:<25} {:<10}", "Title", "Author", "Available"); println!("{}", "-".repeat(65)); @@ -64,14 +64,14 @@ impl Library { if book.available { book.available = false; member.borrowed_books.push(book.title.clone()); - println!("āœ… '{}' has been checked out by {}", title, member.name); + println!("'{}' has been checked out by {}", title, member.name); return true; } else { - println!("āŒ '{}' is already checked out!", title); + println!(" '{}' is already checked out!", title); return false; } } - println!("āŒ Book '{}' not found!", title); + println!(" Book '{}' not found!", title); false } @@ -81,14 +81,14 @@ impl Library { if !book.available { book.available = true; member.borrowed_books.retain(|b| b != title); - println!("āœ… '{}' has been returned by {}", title, member.name); + println!(" '{}' has been returned by {}", title, member.name); return true; } else { - println!("āŒ '{}' wasn't checked out!", title); + println!(" '{}' wasn't checked out!", title); return false; } } - println!("āŒ Book '{}' not found!", title); + println!("Book '{}' not found!", title); false } @@ -100,7 +100,7 @@ impl Library { println!(" Author: {}", book.author); println!(" Status: {}", if book.available { "Available" } else { "Checked Out" }); } else { - println!("āŒ Book '{}' not found!", title); + println!(" Book '{}' not found!", title); } } } \ No newline at end of file diff --git a/rust_session/yahia008/minilib/src/main.rs b/rust_session/yahia008/minilib/src/main.rs index 23a2a1a0..213b1892 100644 --- a/rust_session/yahia008/minilib/src/main.rs +++ b/rust_session/yahia008/minilib/src/main.rs @@ -27,6 +27,25 @@ fn main() { println!("Found: {}", book.title); } - + println!("\n--- Checkout Process ---"); + library.checkout_book("48 laws of power", &mut member); + library.checkout_book("meditation", &mut member); + library.checkout_book("romeo an julliet", &mut member); + + member.list_borrowed_books(); + + println!("\n--- Book Info ---"); + library.display_book_info("48 laws of power"); + library.display_book_info("romeo an julliet"); + println!("\n--- Return Process ---"); + library.return_book("48 laws of power", &mut member); + + println!("\n--- Updated Library ---"); + library.list_books(); + + + println!("\n--- rasputins's Remaining Books ---"); + member.list_borrowed_books(); + } \ No newline at end of file diff --git a/rust_session/yahia008/minilib/src/member.rs b/rust_session/yahia008/minilib/src/member.rs index b5ac1331..4cc663cd 100644 --- a/rust_session/yahia008/minilib/src/member.rs +++ b/rust_session/yahia008/minilib/src/member.rs @@ -16,7 +16,7 @@ impl Member { if self.borrowed_books.is_empty() { println!("{} hasn't borrowed any books.", self.name); } else { - println!("\nšŸ“š {}'s Borrowed Books:", self.name); + println!("\n {}'s Borrowed Books:", self.name); for book in &self.borrowed_books { println!(" - {}", book); }