rodo_lib 0.1.2

A Library for a Todo Manager
Documentation
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),
}

// NOTE: implement trait for fmt::display => for cli
#[serde_as]
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Todo {
    title: String,
    description: String,
    created: u64,
    modified: u64,
    due: u64,
    worked_time: u64, // NOTE: only when open?
    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(),
            },
        )
    }

    /// Updates the modified Field to the current Time
    fn update_modified(&mut self) {
        self.modified = SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .unwrap()
            .as_secs();
    }
    // FIX: get functions for vecs
}

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();
    }
}