devjournal 0.1.0

A dev first cli journaling tool
Documentation
use crate::domain as domain_models;

use crate::utils::date;
use chrono::{Duration, NaiveDateTime};
use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Debug, Serialize, Deserialize)]
pub struct Journal {
    pub id: Uuid,
    pub name: String,
    pub pages: Vec<domain_models::Page>,
}

impl Journal {
    /// Create new entry model
    pub fn new(name: impl Into<String>) -> Self {
        let id = Uuid::new_v4();

        Journal {
            id,
            name: name.into(),
            pages: Vec::new(),
        }
    }

    /// Get todays page from journal
    pub fn todays_page(&mut self) -> &mut domain_models::Page {
        if self.pages.is_empty() {
            let page = domain_models::Page::new(date::now());
            self.add_page(page);
        }

        self.pages.last_mut().unwrap()
    }

    /// Get page for a specified date
    pub fn get_page(&mut self, date: &NaiveDateTime) -> Option<&mut domain_models::Page> {
        println!("looking for {}", date.date());
        for page in &self.pages {
            println!("{}", page.date);
        }
        self.pages
            .iter_mut()
            .find(|page| page.date.date() == date.date())
    }

    /// Add page to journal
    pub fn add_page(&mut self, page: domain_models::Page) {
        self.pages.push(page);
    }

    pub fn add_entry(&mut self, entry: domain_models::Entry) {
        if let Some(page) = self.get_page(&entry.date) {
            page.add_entry(entry);
        } else {
            // Page doesn't exist, so create and add one
            let mut new_page = domain_models::Page::new(entry.date);
            new_page.add_entry(entry);
            self.add_page(new_page);
        }
    }

    pub fn get_page_in_date_range(
        &self,
        from: NaiveDateTime,
        to: Option<NaiveDateTime>,
    ) -> Vec<&domain_models::Page> {
        let to_date = to.unwrap_or_else(|| date::now() + Duration::days(1));

        self.pages
            .iter()
            .filter(|page| from.date() <= page.date.date())
            .filter(|page| page.date.date() <= to_date.date())
            .collect()
    }
}