nyado 0.2.9

A Rust todo-list manager with TUI, inspired by meowdo
use std::time::{SystemTime, UNIX_EPOCH};

pub fn now_secs() -> u64 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_secs()
}

#[derive(Debug, Clone)]
pub struct Todo {
    pub done: bool,
    pub pinned: bool,
    pub tag: String,
    pub text: String,
    pub created_at: u64,
    pub done_at: u64,
    pub due_date: u64,
}

impl Todo {
    pub fn new(text: &str, tag: &str) -> Self {
        Self {
            done: false,
            pinned: false,
            tag: tag.to_string(),
            text: text.to_string(),
            created_at: now_secs(),
            done_at: 0,
            due_date: 0,
        }
    }

    pub fn to_line(&self) -> String {
        format!(
            "{}|{}|{}|{}|{}|{}|{}\n",
            if self.pinned { 'P' } else { '-' },
            if self.done { 'x' } else { ' ' },
            if self.tag.is_empty() { "none" } else { &self.tag },
            self.text,
            self.created_at,
            self.done_at,
            self.due_date
        )
    }

    pub fn from_line(line: &str) -> Option<Self> {
        let parts: Vec<&str> = line.split('|').collect();
        if parts.len() < 6 {
            return None;
        }
        let pinned = parts[0] == "P";
        let done = parts[1] == "x";
        let tag = if parts[2] == "none" {
            String::new()
        } else {
            parts[2].to_string()
        };
        let text = parts[3].to_string();
        let created_at = parts[4].parse().unwrap_or(0);
        let done_at = parts[5].parse().unwrap_or(0);
        let due_date = if parts.len() >= 7 {
            parts[6].parse().unwrap_or(0)
        } else {
            0
        };
        Some(Self {
            done,
            pinned,
            tag,
            text,
            created_at,
            done_at,
            due_date,
        })
    }
}