mood 0.1.0

MOOD: A minimal journaling CLI for logging your everyday mood.
Documentation
use std::{fs::File, path::PathBuf};

use chrono::{Local, NaiveDate};
use directories::BaseDirs;
use ron::{de::from_reader, ser::to_writer};
use serde::{Deserialize, Serialize};

pub fn today() -> NaiveDate {
    Local::now().date_naive()
}

const CONFIG_DIR_NAME: &str = "mood";
pub const CONFIG_NAME: &str = "config.ron";
pub const DEFAULT_JOURNAL_NAME: &str = "journal.ron";

#[derive(Serialize, Deserialize)]
pub struct MoodConfig {
    pub journal_dir: PathBuf,
}
impl Default for MoodConfig {
    fn default() -> Self {
        let config_dir = get_config_dir();
        let config_file_path = get_config_file_path();
        let file = match File::open(&config_file_path) {
            Ok(file) => file,
            Err(_) => {
                println!("No existing config file found, creating one...");
                match std::fs::create_dir(config_dir) {
                    Ok(_) => (),
                    Err(e) => match e.kind() {
                        std::io::ErrorKind::AlreadyExists => (),
                        _ => panic!("Error occured when creating config folder: {e}"),
                    },
                }
                File::create(config_file_path).expect("able to create config file.")
            }
        };

        match from_reader(&file) {
            Ok(config) => config,
            Err(_) => {
                let journal_dir = get_default_journal_dir().join(DEFAULT_JOURNAL_NAME);
                let config = MoodConfig { journal_dir };

                to_writer(&file, &config).expect("save default config to file.");
                println!("Created default config.ron.");
                config
            }
        }
    }
}

pub fn get_config_dir() -> PathBuf {
    let base_dir = BaseDirs::new().expect("able to get base dirs for platform");
    base_dir.config_local_dir().join(CONFIG_DIR_NAME)
}

pub fn get_config_file_path() -> PathBuf {
    get_config_dir().join(CONFIG_NAME)
}

pub fn get_default_journal_dir() -> PathBuf {
    get_config_dir()
}