summaryrefslogblamecommitdiff
path: root/rust-book/employees/src/main.rs
blob: 0900bed324820dacfa41114d57015c3fd1d8e069 (plain) (tree)




















































































































































































                                                                                                              
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."),
        }

    }

}