From 09210efbd4b636ac9887e2da19014b2761a91c32 Mon Sep 17 00:00:00 2001 From: martin machiebe Date: Thu, 17 Apr 2025 17:40:49 +0100 Subject: [PATCH] feat: impl student reg --- src/main.rs | 1 + src/student_reg.rs | 138 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/student_reg.rs diff --git a/src/main.rs b/src/main.rs index 74558d1..adcfcf7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod constructor; mod float; mod signed; mod string; +mod student_reg; mod todo; mod unsigned; mod user_struct; diff --git a/src/student_reg.rs b/src/student_reg.rs new file mode 100644 index 0000000..aaa323e --- /dev/null +++ b/src/student_reg.rs @@ -0,0 +1,138 @@ +use std::collections::HashMap; + +pub struct StudentData { + data: HashMap, +} + +#[derive(Debug, Clone)] +struct StudentRegistry { + pub id: u32, + pub name: String, + pub status: Status, + pub gender: Gender, + pub year: u8, + pub age: u8, + pub department: Department, + pub email: String, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Department { + MassCom, + ComputerScience, + Medicine, + Law, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Gender { + Male, + Female, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum Status { + Registered, + Expelled, + Suspended, + Graduated, +} + +impl StudentData { + fn register_student( + &mut self, + name: String, + age: u8, + department: Department, + gender: Gender, + email: String, + ) -> Result { + let length: u32 = (self.data.len() + 1) as _; + let is_student_exist = self.data.contains_key(&email); + + if !is_student_exist { + let student_data = StudentRegistry { + age, + department, + gender, + id: length, + name, + status: Status::Registered, + year: 1, + email: email.clone(), + }; + + self.data.insert(email, student_data); + Ok("successfully registered".to_string()) + } else { + Err("user already exist".to_string()) + } + } + + fn get_all_students(self) -> HashMap { + self.data + } + + fn get_student_by_id(self, id: String) -> Result { + let student = self.data.get(&id); + match student { + Some(data) => Ok(data.clone()), + None => Err("user does not exist".to_string()), + } + } + + fn get_student_by_status(self, status: Status) -> Vec { + let student_collection = self.data; + let mut student_data = Vec::new(); + + for (_, value) in student_collection { + if value.status == status { + student_data.push(value) + } + } + + student_data + } + + fn change_status(mut self, id: String, status: Status) -> Result { + let student = self.data.contains_key(&id); + + if student { + let current_student = self.data.get(&id).unwrap(); + let updated_student_data = StudentRegistry { + status: status, + ..current_student.clone() + }; + self.data.insert(id, updated_student_data); + Ok("successfully update".to_string()) + } else { + Err("failed to update".to_string()) + } + } + + fn get_by_gender(self, gender: Gender) -> Vec { + let student_collection = self.data; + let mut student_data = Vec::new(); + + for (_, value) in student_collection { + if value.gender == gender { + student_data.push(value) + } + } + + student_data + } + + fn get_student_by_department(self, department: Department) -> Vec { + let student_collection = self.data; + let mut student_data = Vec::new(); + + for (_, value) in student_collection { + if value.department == department { + student_data.push(value) + } + } + + student_data + } +}