From 2e199e8f1c78d0ffc79c0a20a1d2a7a62aa4f5c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Mon, 16 Sep 2024 04:52:19 +0300 Subject: [PATCH] refactor: :recycle: better developer experience --- src/main.rs | 169 ++++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 86 deletions(-) diff --git a/src/main.rs b/src/main.rs index b260c17..d59c275 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,56 +3,33 @@ use std::io; const PROCESS_COUNT: usize = 5; const RESOURCE_COUNT: usize = 3; + fn main() { println!("Hello, world!"); let mut restart: bool = true; while restart { println!("Max A Resource"); - let mut resource_input: String = String::new(); - if let Err(err_val) = io::stdin().read_line(&mut resource_input) { - println!("Failed to Read: {}", err_val); - return; - } - let a: u8 = match resource_input.trim().parse::() { - Ok(value) => value, - Err(err_val) => { - println!("Failed to Convert: {}", err_val); - return; - } + let a = match get_u8_input() { + Some(resource_input) => resource_input, + None => return, }; println!("Max B Resource"); - let mut resource_input: String = String::new(); - if let Err(err_val) = io::stdin().read_line(&mut resource_input) { - println!("Failed to Read: {}", err_val); - return; - } - let b = match resource_input.trim().parse::() { - Ok(value) => value, - Err(err_val) => { - println!("Failed to Convert: {}", err_val); - return; - } + let b = match get_u8_input() { + Some(resource_input) => resource_input, + None => return, }; println!("Max C Resource"); - let mut resource_input: String = String::new(); - if let Err(err_val) = io::stdin().read_line(&mut resource_input) { - println!("Failed to Read: {}", err_val); - return; - } - let c = match resource_input.trim().parse::() { - Ok(value) => value, - Err(err_val) => { - println!("Failed to Convert: {}", err_val); - return; - } + let c = match get_u8_input() { + Some(resource_input) => resource_input, + None => return, }; println!("\n\tA = {}\n\tB = {}\n\tC = {}", a, b, c); if a == 0 || b == 0 || c == 0 { - println!("Exit: Zero as a Input Invalid"); + eprintln!("Exit: Zero as a Input is Invalid"); return; } @@ -60,36 +37,13 @@ fn main() { let mut assigned_resources_matrix = [[0_u8; RESOURCE_COUNT]; PROCESS_COUNT]; let mut info: (bool, Vec) = (false, Vec::with_capacity(PROCESS_COUNT)); while !info.0 { - for i in 0..PROCESS_COUNT { - let mut rng = rand::thread_rng(); - let random = rng.gen_range(0..a); - max_needs_matrix[i][0] = random; - if random != 0 { - assigned_resources_matrix[i][0] = rng.gen_range(0..random); - } else { - assigned_resources_matrix[i][0] = 0; - } - } - for i in 0..PROCESS_COUNT { - let mut rng = rand::thread_rng(); - let random = rng.gen_range(0..b); - max_needs_matrix[i][1] = random; - if random != 0 { - assigned_resources_matrix[i][1] = rng.gen_range(0..random); - } else { - assigned_resources_matrix[i][1] = 0; - } - } - for i in 0..PROCESS_COUNT { - let mut rng = rand::thread_rng(); - let random = rng.gen_range(0..c); - max_needs_matrix[i][2] = random; - if random != 0 { - assigned_resources_matrix[i][2] = rng.gen_range(0..random); - } else { - assigned_resources_matrix[i][2] = 0; - } - } + assign_resource_matrix( + &mut max_needs_matrix, + &mut assigned_resources_matrix, + a, + b, + c, + ); info = banker(a, b, c, max_needs_matrix, assigned_resources_matrix); } println!("Max Needs Matrix"); @@ -99,23 +53,16 @@ fn main() { let mut answers: [u8; PROCESS_COUNT] = [0; PROCESS_COUNT]; for (answer, correct_answer) in answers.iter_mut().zip(&info.1) { println!("Which Process Should be Done Now ?"); - let mut input = String::new(); - if let Err(err_val) = io::stdin().read_line(&mut input) { - eprintln!("Error: Reading User Input | {}", err_val); - return; - } - let input: u8 = match input.trim().parse() { - Ok(parsed) => parsed, - Err(err_val) => { - eprintln!("Error: Converting User Input | {}", err_val); - return; + match get_u8_input() { + Some(input) => { + *answer = input; + if *correct_answer == input { + println!("Correct"); + } else { + println!("Wrong it should be = {}", correct_answer); + } } - }; - *answer = input; - if *correct_answer == input { - println!("Correct"); - } else { - println!("Wrong it should be = {}", correct_answer); + None => return, } } println!("Your Answers"); @@ -127,13 +74,11 @@ fn main() { println!("P{}", correct_answer); } - let mut resource_input: String = String::new(); println!("Press 'r' to Restart"); - if let Err(err_val) = io::stdin().read_line(&mut resource_input) { - println!("Failed to Read: {}", err_val); - return; - } - resource_input = resource_input.trim().to_string(); + let resource_input = match get_input() { + Some(input) => input, + None => return, + }; match resource_input.as_str() { "r" => { restart = true; @@ -146,6 +91,58 @@ fn main() { } } +fn get_input() -> Option { + let mut input: String = String::new(); + if let Err(err_val) = io::stdin().read_line(&mut input) { + eprintln!("Error: Failed to Read | {}", err_val); + return None; + } + Some(input.trim_end().to_string()) +} + +fn get_u8_input() -> Option { + match get_input() { + Some(input) => match input.parse::() { + Ok(input) => Some(input), + Err(err_val) => { + eprintln!("Error: Failed to Convert | {}", err_val); + None + } + }, + None => None, + } +} + +fn assign_resource_matrix_column( + max_needs_matrix: &mut [[u8; RESOURCE_COUNT]; PROCESS_COUNT], + assigned_resources_matrix: &mut [[u8; RESOURCE_COUNT]; PROCESS_COUNT], + random_limit: u8, + which_resource: usize, +) { + for i in 0..PROCESS_COUNT { + let mut rng = rand::thread_rng(); + let random = rng.gen_range(0..random_limit); + max_needs_matrix[i][which_resource] = random; + if random != 0 { + assigned_resources_matrix[i][which_resource] = rng.gen_range(0..random); + } else { + assigned_resources_matrix[i][which_resource] = 0; + } + } +} + +fn assign_resource_matrix( + max_needs_matrix: &mut [[u8; RESOURCE_COUNT]; PROCESS_COUNT], + assigned_resources_matrix: &mut [[u8; RESOURCE_COUNT]; PROCESS_COUNT], + a: u8, + b: u8, + c: u8, +) { + assign_resource_matrix_column(max_needs_matrix, assigned_resources_matrix, a, 0); + assign_resource_matrix_column(max_needs_matrix, assigned_resources_matrix, b, 1); + assign_resource_matrix_column(max_needs_matrix, assigned_resources_matrix, c, 2); +} + fn print_matrix(matrix: [[u8; RESOURCE_COUNT]; PROCESS_COUNT]) { for (i, matrix_column) in matrix.iter().enumerate() { print!("\n\t Process {}: ", i);