use std::io::{stdin, Error, ErrorKind}; use crate::{add, config::Cfg, list}; pub struct Input { pub command: String, pub args: Option>, } impl Input { pub fn from(string: String) -> Result> { let mut split: Vec<&str> = string.split(' ').collect(); let command: String; let mut args: Option> = None; if split[0].is_empty() { split.remove(0); }; match split.len() { 0 => { Err(Box::new(Error::new(ErrorKind::InvalidInput, "NO_ARGS"))) } 1 => Ok( Input { command: split[0].to_string(), args }), 2.. => { command = split[0].to_string(); split.remove(0); let mut str_args: Vec = vec![]; for e in split { str_args.push(e.to_string()); } args = Some(str_args); Ok(Input { command, args }) }, _ => { panic!("This should never happen") } } } } pub async fn get_input(config: Cfg) -> Result<(), Box> { let mut user_input = String::new(); stdin() .read_line(&mut user_input) .expect("ERROR"); let input = Input::from(user_input.trim().to_string())?; match input.command.as_str() { "add" => { if input.args == None { return Err(Box::new(Error::new(ErrorKind::InvalidInput, "TOO_FEW_ARGUMENTS"))) }; if input.args.as_ref().unwrap().len() != 1 { return Err(Box::new(Error::new(ErrorKind::InvalidInput, "TOO_MANY_ARGUMENTS"))) }; add(config, input.args.unwrap()[0].to_string()).await?; Ok(()) }, "list" => { list(config, input.args) }, _ => Err(Box::new(Error::new(ErrorKind::InvalidInput, "UNKNOWN_COMMAND"))), } }