use tabled::Table;
use crate::domain::CreateTaskRequest;
use crate::persister;
pub trait Execute {
fn execute(&self);
}
#[derive(Debug)]
pub(crate) enum AppCommand {
CreateTaskCommand(CreateTask),
GetTasksCommand(GetTasks),
DeleteTaskCommand(DeleteTask),
}
impl AppCommand {
pub(crate) fn execute(&self) {
match self {
AppCommand::GetTasksCommand(value) => value.execute(),
AppCommand::DeleteTaskCommand(value) => value.execute(),
AppCommand::CreateTaskCommand(value) => value.execute(),
}
}
}
#[derive(Debug)]
pub(crate) struct GetTasks {
pub(crate) page_number: Option<usize>,
pub(crate) page_size: Option<usize>,
}
impl GetTasks {
pub(crate) fn new(page_number: Option<usize>, page_size: Option<usize>) -> GetTasks {
GetTasks {
page_number,
page_size,
}
}
}
#[derive(Debug)]
pub(crate) struct CreateTask;
#[derive(Debug)]
pub(crate) struct CreateProject;
#[derive(Debug)]
pub(crate) struct DeleteTask {
pub(crate) id: u64,
}
impl Execute for CreateTask {
fn execute(&self) {
let mut task_id = String::new();
let mut task_name = String::new();
let mut task_desc = String::new();
println!("Please input the task id!");
std::io::stdin().read_line(&mut task_id).unwrap();
println!("Please input the task name!");
std::io::stdin().read_line(&mut task_name).unwrap();
println!("Please input the task description!");
std::io::stdin().read_line(&mut task_desc).unwrap();
let task = CreateTaskRequest {
id: task_id.trim().parse().unwrap(),
name: task_name.trim().to_string(),
description: if !task_desc.is_empty() {
Some(task_desc.trim().to_string())
} else {
None
},
};
persister::save_task(&task);
}
}
impl Execute for GetTasks {
fn execute(&self) {
let tasks = persister::get_tasks(self.page_number, self.page_size);
let out_str = Table::new(tasks).to_string();
println!("{}", out_str);
}
}
impl Execute for DeleteTask {
fn execute(&self) {
persister::delete_task(self.id);
}
}