use std::str::FromStr; use crate::{Directory, State}; static PROJECTS_DIR: &'static str = "stuff"; static HOME_DIR: &'static str = "projects"; pub fn handle_command(command_string : String, state : &mut State) { let mut words = command_string.split(' '); let command = words.next().unwrap(); let args = words.collect::>(); match command { "clear" => { state.output.clear(); } "cd" => { if args.len() == 0 { state.current_working_directory = Directory::Home; } else { match state.current_working_directory { Directory::Home => { match args[0] { "~" => (), "~/" => (), ".." => state.output.push_back(String::from_str("bash: cd: ..: Permission denied").unwrap()), "../" => state.output.push_back(String::from_str("bash: cd: ..: Permission denied").unwrap()), "projects" => state.current_working_directory = Directory::Projects, "projects/" => state.current_working_directory = Directory::Projects, _ => { if args[0].chars().next().unwrap() == '/' { state.output.push_back(format!("bash: cd: {}: Permission denied", args[0])); } else { state.output.push_back(format!("bash: cd: {}: No such file or directory", args[0])); } } } }, Directory::Projects => { match args[0] { "~" => state.current_working_directory = Directory::Home, "~/" => state.current_working_directory = Directory::Home, ".." => state.current_working_directory = Directory::Home, "../" => state.current_working_directory = Directory::Home, _ => { if args[0].chars().next().unwrap() == '/' { state.output.push_back(format!("bash: cd: {}: Permission denied", args[0])); } else { state.output.push_back(format!("bash: cd: {}: No such file or directory", args[0])); } } } } } } } "ls" => match state.current_working_directory { Directory::Home => match args.len() { 0 => state.output.push_back(String::from_str(HOME_DIR).unwrap()), 1 => match args[0] { "projects" => state.output.push_back(String::from_str(PROJECTS_DIR).unwrap()), "projects/" => state.output.push_back(String::from_str(PROJECTS_DIR).unwrap()), _ => state.output.push_back(format!("bash: ls: '{}': No such file or directory", args[0])) }, _ => state.output.push_back(format!("bash: ls: too many arguments")) }, Directory::Projects => match args.len() { 0 => state.output.push_back(String::from_str(PROJECTS_DIR).unwrap()), 1 => match args[0] { ".." => state.output.push_back(String::from_str(HOME_DIR).unwrap()), "../" => state.output.push_back(String::from_str(HOME_DIR).unwrap()), _ => state.output.push_back(format!("bash: ls: '{}': No such file or directory", args[0])) }, _ => state.output.push_back(format!("bash: ls: too many arguments")) } } _ => { state.output.push_back(format!("bash: {}: command not found", command)); } } }