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}