todui/
task_form.rs

1use anyhow::Context;
2use anyhow::Result;
3
4use crate::configuration::Settings;
5use crate::repeat::Repeat;
6use crate::task::Task;
7use crate::utils;
8
9#[derive(Default)]
10pub struct TaskForm {
11    pub id: Option<usize>,
12    pub name: String,
13    pub date: String,
14    pub repeats: String,
15    pub group: String,
16    pub description: String,
17    pub url: String,
18}
19
20impl TaskForm {
21    pub fn from_task(task: &Task, settings: &Settings) -> Self {
22        Self {
23            id: task.id,
24            name: task.name.to_string(),
25            date: utils::date_to_input_str(&task.date, settings),
26            repeats: task.repeats.to_string(),
27            group: task.group.clone().unwrap_or_default(),
28            description: task.description.clone().unwrap_or_default(),
29            url: task.url.clone().unwrap_or_default(),
30        }
31    }
32
33    pub fn submit(&mut self, settings: &Settings) -> Result<Task> {
34        let mut task = Task::default();
35
36        let repeat = Repeat::parse_from_str(&self.repeats).context("Invalid repeat format")?;
37        let date = utils::parse_date(&self.date, settings).unwrap_or(utils::get_today());
38
39        if self.name.is_empty() {
40            return Err(anyhow::anyhow!("Task name cannot be empty"));
41        }
42
43        task.set_id(self.id);
44        task.set_name(self.name.clone());
45        task.set_date(date);
46        task.set_repeats(repeat);
47        if !self.group.is_empty() {
48            task.set_group(self.group.clone());
49        }
50        if !self.description.is_empty() {
51            task.set_description(self.description.clone());
52        }
53        if !self.url.is_empty() {
54            task.set_url(self.url.clone());
55        }
56
57        Ok(task)
58    }
59}