1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use crate::Reminder; use chrono::{DateTime, Local}; use serde::{Deserialize, Serialize}; use std::fmt; use std::iter; #[derive(Serialize, Deserialize, Clone)] pub struct Task { name: String, #[serde(skip_serializing_if = "Option::is_none")] details: Option<String>, start: DateTime<Local>, } impl Task { pub fn new(name: String) -> Self { Self { name, details: None, start: Local::now(), } } pub fn name(&self) -> &String { &self.name } pub fn details(&self) -> &Option<String> { &self.details } pub fn start(&self) -> &DateTime<Local> { &self.start } pub fn edit(&mut self, name: String, details: Option<String>) { self.name = name; self.details = details; } pub fn from_reminder(reminder: &Reminder) -> Self { let mut task = Self::new(format!("📆 {}", &reminder.name().clone())); if let Some(details) = reminder.details() { task.details = Some(details.clone()); } task } } impl fmt::Display for Task { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let hr = iter::repeat("=") .take(self.name.chars().count()) .collect::<String>(); let details = self .details .clone() .unwrap_or_else(|| "No details...".into()); writeln!(f, "{}", &self.name)?; writeln!(f, "{}", hr)?; write!(f, "{}", details) } }