use std::collections::HashMap; use std::process; use std::io::{self, Write}; struct Employees { departments: HashMap>, } 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 { 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> = 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 "); println!("\tremove "); println!("Enter 'help' for help or Ctrl+D to exit."); }, // all else fails _ => eprintln!("Invalid command."), } } }