use std::{borrow::Cow, result};
use crate::{output, text::r#type::Text};
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct Task<'a> {
pub(crate) text_list: Vec<Text<'a>>,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) enum TaskResult<'a> {
SuccessText(Text<'a>),
SuccessStr(String),
SuccessDefault,
Fail,
}
impl<'a> Task<'a> {
pub(crate) fn new() -> Self {
Self { text_list: vec![] }
}
pub(crate) fn add(&mut self, new_text: Text<'a>) -> &mut Self {
if new_text.text.is_empty() {
return self;
}
self.text_list.push(new_text);
self
}
pub(crate) fn remove(&mut self, idx: usize) -> TaskResult {
if idx >= self.text_list.len() {
return TaskResult::Fail;
}
self.text_list.remove(idx);
TaskResult::SuccessDefault
}
pub(crate) fn query_idx(&mut self, idx: usize) -> TaskResult {
if idx >= self.text_list.len() {
return TaskResult::Fail;
}
let text: Text<'a> = self.text_list[idx].clone();
let remove_res: TaskResult<'_> = self.remove(idx);
match remove_res {
TaskResult::SuccessDefault => {
let output_str: Cow<'_, str> = Text::new_from(&text).get_display_str_cow();
return TaskResult::SuccessText(text);
}
_ => remove_res,
}
}
pub(crate) fn query_idx_format_str(&mut self, idx: usize) -> TaskResult {
if idx >= self.text_list.len() {
return TaskResult::Fail;
}
let text: Text<'a> = self.text_list[idx].clone();
self.text_list.remove(idx);
let output_str: String = Text::new_from(&text).get_display_str_cow().into_owned();
TaskResult::SuccessStr(output_str)
}
pub(crate) fn run_idx(&mut self, idx: usize) -> TaskResult {
let result: TaskResult<'_> = self.query_idx(idx);
if result == TaskResult::Fail {
return TaskResult::Fail;
}
match result {
TaskResult::SuccessText(success_text) => {
let output_str: Cow<'_, str> = Text::new_from(&success_text).get_display_str_cow();
print!("{}", output_str);
TaskResult::SuccessText(success_text)
}
_ => result,
}
}
pub(crate) fn clear(&mut self) -> &mut Self {
self.text_list.clear();
self
}
pub(crate) fn run_all(&mut self) -> &mut Self {
let copy_task_list: Vec<Text<'a>> = self.text_list.clone();
self.clear();
let mut output_str: String = String::new();
for text in copy_task_list {
let colored_time: &Cow<'_, str> = &Text::new_from(&text).get_display_str_cow();
output_str.push_str(colored_time);
}
print!("{}", output_str);
self
}
}