taskman 0.1.0

Cli for the task management.
use crate::commands::{Command, CreateTask, DeleteTask, GetTasks};

pub(crate) fn parse(args: Vec<String>) -> Result<Command, ParseError> {
    let str_cmd = args.get(1).unwrap();
    match str_cmd.as_str() {
        "create" => match args.get(2).unwrap().as_str() {
            "task" => Ok(Command::CreateTask(CreateTask)),
            _ => Err(ParseError::ParseCommandError(
                "Parse command error!".to_string(),
            )),
        },
        "get" => match args.get(2).unwrap().as_str() {
            "tasks" => Ok(Command::GetTasks(GetTasks::from(None, None))),
            _ => Err(ParseError::ParseCommandError(
                "This command does not exist!".to_string(),
            )),
        },
        "delete" => match args.get(2).unwrap().as_str() {
            "task" => {
                let id = args
                    .iter()
                    .filter(|s| "-id=" == &s[0..=3])
                    .map(|x| String::from(&x[4..]))
                    .collect::<Vec<String>>()
                    .get(0)
                    .unwrap()
                    .parse::<u64>()
                    .unwrap();

                Ok(Command::DeleteTask(DeleteTask { id }))
            }
            _ => todo!(),
        },
        _ => todo!(),
    }
}

#[derive(Debug)]
pub(crate) enum ParseError {
    ParseCommandError(String),
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::commands::{Command, CreateTask, DeleteTask, GetTasks};
    use std::matches;

    #[test]
    fn parse_create_task_command() {
        let test_args = vec!["path".to_string(), "create".to_string(), "task".to_string()];
        let command = parse(test_args);
        assert!(matches!(Command::CreateTask(CreateTask), command));
    }
    #[test]
    fn parse_get_tasks_command_with_none_values() {
        let test_args = vec!["path".to_string(), "get".to_string(), "tasks".to_string()];
        let command = parse(test_args).unwrap();
        assert!(matches!(
            Command::GetTasks(GetTasks::from(None, None)),
            command
        ));
        match command {
            Command::GetTasks(get_tasks) => {
                assert_eq!(get_tasks.page_number, None);
                assert_eq!(get_tasks.page_size, None);
            }
            _ => panic!("Command must be GetTasks"),
        }
    }
}