use simply_colored::*;
use std::fmt;
use std::{collections::HashMap, io};
use text_io;
fn main() {
let mut deps_employees: HashMap<String, Employees> = HashMap::new();
loop {
let mut input_buff = String::new();
println!("{BG_BLUE}Drop a line:{BG_DIM_BLACK}");
if get_line(&mut input_buff).is_err() || input_buff.trim().is_empty() {
break;
}
let dep = parse_department(&input_buff).unwrap();
let employee = parse_employee(&input_buff).unwrap();
deps_employees
.entry(dep)
.and_modify(|v: &mut Employees| v.0.push(employee.clone()))
.or_insert(Employees(vec![employee]));
}
println!(
"Press Enter to show all people in the company by department
or enter department name to show the department's employees"
);
loop {
let prompt_reply: String = text_io::read!("{}\n");
let prompt_reply = prompt_reply.trim();
if prompt_reply.is_empty() {
print_deps_employees(&deps_employees);
break;
}
if let Some(employees) = deps_employees.get(prompt_reply) {
println!("Employees in '{}': {}", prompt_reply, employees);
} else {
println!("Not found!");
}
}
}
fn get_line(buff: &mut String) -> io::Result<usize> {
io::stdin().read_line(buff)
}
fn parse_department(input_buff: &str) -> Option<String> {
match input_buff.split_whitespace().nth(3) {
Some(dep_name) => Some(dep_name.to_owned()),
None => None,
}
}
fn parse_employee(input_buff: &str) -> Option<String> {
match input_buff.split_whitespace().nth(1) {
Some(dep_name) => Some(dep_name.to_owned()),
None => None,
}
}
fn print_deps_employees(deps_employees: &HashMap<String, Employees>) {
for (dep, employees) in deps_employees.iter() {
println!("Dep. `{}`: {}", dep, employees);
}
}
impl fmt::Display for Employees {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut result = String::new();
for item in self.0.iter() {
result.push_str(&item);
}
f.write_str(&result)
}
}
struct Employees(Vec<String>);