From 7aec8284c03a866adff95e7040ee7e987d89d795 Mon Sep 17 00:00:00 2001 From: Christopher Date: Thu, 2 Mar 2023 10:24:13 +1300 Subject: [PATCH] can now specify positional params on the nav command --- 84_Super_Star_Trek/rust/src/main.rs | 36 +++++++++++++++++++++-------- 84_Super_Star_Trek/rust/tasks.md | 2 +- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/84_Super_Star_Trek/rust/src/main.rs b/84_Super_Star_Trek/rust/src/main.rs index 498c5bd2..4212c6a7 100644 --- a/84_Super_Star_Trek/rust/src/main.rs +++ b/84_Super_Star_Trek/rust/src/main.rs @@ -20,9 +20,13 @@ fn main() { view::short_range_scan(&galaxy); loop { - match prompt("Command?").to_uppercase().as_str() { + let command = prompt("Command?"); + if command.len() == 0 { + continue; + } + match command[0].to_uppercase().as_str() { "SRS" => view::short_range_scan(&galaxy), - "NAV" => gather_dir_and_speed_then_move(&mut galaxy), + "NAV" => gather_dir_and_speed_then_move(&mut galaxy, command[1..].into()), _ => view::print_command_help() } @@ -33,15 +37,15 @@ fn main() { } } -fn gather_dir_and_speed_then_move(galaxy: &mut Galaxy) { +fn gather_dir_and_speed_then_move(galaxy: &mut Galaxy, provided: Vec) { - let course = prompt_value::("Course (1-9)?", 1, 9); + let course = param_or_prompt_value(&provided, 0, "Course (1-9)?", 1, 9); if course.is_none() { view::bad_nav(); return; } - let speed = prompt_value::("Warp Factor (0-8)?", 0.0, 8.0); + let speed = param_or_prompt_value(&provided, 1, "Warp Factor (0-8)?", 0.0, 8.0); if speed.is_none() { view::bad_nav(); return; @@ -54,7 +58,7 @@ fn gather_dir_and_speed_then_move(galaxy: &mut Galaxy) { commands::move_enterprise(course.unwrap(), speed.unwrap(), galaxy); } -fn prompt(prompt_text: &str) -> String { +fn prompt(prompt_text: &str) -> Vec { let stdin = stdin(); let mut stdout = stdout(); @@ -63,15 +67,29 @@ fn prompt(prompt_text: &str) -> String { let mut buffer = String::new(); if let Ok(_) = stdin.read_line(&mut buffer) { - return buffer.trim_end().into(); + return buffer.trim_end().split(" ").map(|s| s.to_string()).collect(); } - "".into() + Vec::new() } fn prompt_value(prompt_text: &str, min: T, max: T) -> Option { let passed = prompt(prompt_text); - match passed.parse::() { + if passed.len() != 1 { + return None + } + match passed[0].parse::() { Ok(n) if (n >= min && n <= max) => Some(n), _ => None } } + +fn param_or_prompt_value(params: &Vec, param_pos: usize, prompt_text: &str, min: T, max: T) -> Option { + if params.len() > param_pos { + match params[param_pos].parse::() { + Ok(n) => Some(n), + _ => None + } + } else { + return prompt_value::(prompt_text, min, max); + } +} \ No newline at end of file diff --git a/84_Super_Star_Trek/rust/tasks.md b/84_Super_Star_Trek/rust/tasks.md index 374c1a29..da2b9c1b 100644 --- a/84_Super_Star_Trek/rust/tasks.md +++ b/84_Super_Star_Trek/rust/tasks.md @@ -18,4 +18,4 @@ Started after movement and display of stats was finished (no energy management o - [ ] stop before hitting an object - when moving across a sector, the enterprise should stop before it runs into something - the current move is a jump, which makes this problematic. would need to rewrite it -- [ ] better command reading - support entering multiple values on a line (e.g. nav 3 0.1) +- [x] better command reading - support entering multiple values on a line (e.g. nav 3 0.1)