diff options
author | Adam Carpenter <53hornet@gmail.com> | 2019-03-27 15:32:37 -0400 |
---|---|---|
committer | Adam Carpenter <53hornet@gmail.com> | 2019-03-27 15:32:37 -0400 |
commit | 67cdcc2e12118becb823e20a40cc2687f2b8425a (patch) | |
tree | ed92c3234b89079e6d4cf36f5e80c5ffa79def48 /rust-book/employees/src/main.rs | |
parent | e25482fca375d318a39c3b54db396b0db6e0b263 (diff) | |
download | learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.tar.xz learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.zip |
Started Rust in Action MEAP.
Diffstat (limited to 'rust-book/employees/src/main.rs')
-rwxr-xr-x | rust-book/employees/src/main.rs | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/rust-book/employees/src/main.rs b/rust-book/employees/src/main.rs new file mode 100755 index 0000000..0900bed --- /dev/null +++ b/rust-book/employees/src/main.rs @@ -0,0 +1,181 @@ +use std::collections::HashMap; +use std::process; +use std::io::{self, Write}; + +struct Employees { + departments: HashMap<String, Vec<String>>, +} + +impl Employees { + + fn add_employee(&self, name: &Option<&String>, department: &Option<&String>) -> Result<(), &'static str> { + // parse name + let name = match name { + Some(s) => s, + None => { + return Err("Invalid or empty name."); + }, + }; + + // parse department + let dept = match department { + Some(s) => s, + None => { + return Err("Invalid or empty department."); + }, + }; + + // add name to department in departments + // and create department if it doesn't exist + employees.entry(dept.to_string()) + .or_insert(Vec::new()) + .push(name.to_string()); + + Ok(()) + } +} + +//fn list_employees() { +// let dept = match actions.get(1) { +// Some(s) => s, +// None => { +// "" +// } +// }; +// +// if dept == "" { +// // print employees in all depts +// for each in employees.keys() { +// println!("{}", each); +// match employees.get(&each.to_string()) { +// Some(v) => { +// for every in v { +// println!(" {}", every); +// } +// }, +// None => continue, +// }; +// } +// } +// else { +// // print employees in single dept +// match employees.get(&dept.to_string()) { +// Some(v) => { +// for every in v { +// println!("{}", every); +// }; +// }, +// None => { +// eprintln!("List: Invalid department."); +// continue; +// } +// }; +// } +//} +// +//fn list_employee(name) { +//} + + +//fn remove_employee(name) { +// let name = match actions.get(1) { +// Some(s) => s, +// None => { +// eprintln!("Remove: Invalid or empty name."); +// continue; +// }, +// }; +// +// let dept = match actions.get(2) { +// Some(s) => s, +// None => { +// eprintln!("Remove: Empty department."); +// continue; +// }, +// }; +// +// match employees.get_mut(&dept.to_string()) { +// Some(v) => { +// v.retain(|employee| employee != name); +// }, +// None => { +// eprintln!("Remove: Invalid department."); +// continue; +// } +// }; + +//} + +fn get_actions() -> Vec<String> { + print!("> "); + io::stdout().flush().unwrap(); + + // grab input + let mut input = String::new(); + io::stdin().read_line(&mut input) + .expect("Failed to read input."); + + // finish on eof + if input == "" { + println!("Bye."); + process::exit(0); + } + + // collect all CLI arguments into vector of trimmed Strings + input.trim() + .split_whitespace() + .map(|action| action.to_string()) + .collect() +} + +fn main() { + println!("Welcome to employee manager."); + println!("Enter 'help' for help or Ctrl+D to exit."); + let mut departments: HashMap<String, Vec<String>> = HashMap::new(); + + // operating loop + loop { + let actions = get_actions(); + + // act on actions + let command = match actions.get(0) { + Some(c) => c, + None => { + eprintln!("Empty command. Enter Ctrl+D to exit."); + continue; + } + }; + + match command.as_str() { + // add employee to department + "add" => { + match add_employee(&actions.get(1), &actions.get(2), &mut departments) { + Ok(()) => {dbg!(&departments);}, + Err(e) => eprintln!("{}", e), + }; + }, + + // list employees from one or all departments + "list" => { + }, + + // remove employee from department + "remove" => { + }, + + // print help + "help" => { + println!("Valid commands include:"); + println!("\tlist [department]"); + println!("\tadd <name> <department>"); + println!("\tremove <name> <department>"); + println!("Enter 'help' for help or Ctrl+D to exit."); + }, + + // all else fails + _ => eprintln!("Invalid command."), + } + + } + +} |