use std::time::{SystemTime, UNIX_EPOCH};
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use uuid::Uuid;
use crate::utils::{edit_vecs, RodoStruct};
pub enum FIELDS {
TITLE(String),
DESCRIPTION(String),
DUE(u64),
PRIORITY(Uuid),
STATE(Uuid),
PATH(Uuid),
TAG(Uuid),
ASSINGEE(Uuid),
COMMENTS(Uuid),
DEPENDS(Uuid),
}
#[serde_as]
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Todo {
title: String,
description: String,
created: u64,
modified: u64,
due: u64,
worked_time: u64, priority: Uuid,
state: Uuid,
paths: Vec<Uuid>,
tags: Vec<Uuid>,
assingees: Vec<Uuid>,
comments: Vec<Uuid>,
depends: Vec<Uuid>,
}
impl Todo {
#![allow(clippy::too_many_arguments)]
pub fn new(
title: &str,
description: &str,
due: u64,
priority: Uuid,
state: Uuid,
paths: Vec<Uuid>,
tags: Vec<Uuid>,
assingees: Vec<Uuid>,
depends: Vec<Uuid>,
) -> (Uuid, Self) {
(
Uuid::new_v4(),
Self {
title: String::from(title),
description: String::from(description),
created: SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs(),
modified: 0,
due,
priority,
worked_time: 0,
state,
paths,
tags,
assingees,
depends,
comments: Vec::new(),
},
)
}
fn update_modified(&mut self) {
self.modified = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
}
}
impl RodoStruct<FIELDS> for Todo {
fn edit(&mut self, fields: FIELDS) {
match fields {
FIELDS::TITLE(t) => self.title = t,
FIELDS::DESCRIPTION(d) => self.description = d,
FIELDS::DUE(d) => self.due = d,
FIELDS::PRIORITY(p) => self.priority = p,
FIELDS::STATE(s) => self.state = s,
FIELDS::PATH(u) => edit_vecs(&mut self.paths, u),
FIELDS::TAG(u) => edit_vecs(&mut self.tags, u),
FIELDS::ASSINGEE(u) => edit_vecs(&mut self.assingees, u),
FIELDS::DEPENDS(u) => edit_vecs(&mut self.depends, u),
FIELDS::COMMENTS(u) => edit_vecs(&mut self.comments, u),
}
self.update_modified();
}
}