englog 0.1.3

Keep a work log as a software developer for looking back on during yearly reviews etc.
Documentation
use anyhow::Result;
use englog::app::App;
use englog::tui::Tui;
use englog::update::update;
use ratatui::prelude::CrosstermBackend;
use ratatui::Terminal;
use std::io;

const DEFAULT_FILE_NAME: &str = "englog.postcard";
#[allow(dead_code)]
const SEED_FILE_NAME: &str = "seed.postcard";

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let cfg: englog::config::Config = confy::load("englog", None).unwrap_or_else(|_| {
        let path = confy::get_configuration_file_path("englog", None)
            .expect("Failed to get config file path");
        std::fs::remove_file(path).expect("Failed to remove corrupted config file");
        confy::load("englog", None).expect("Failed to load new config file")
    });

    let mut tui = Tui::new(Terminal::new(CrosstermBackend::new(io::stdout()))?);

    tui.enter()?;

    let mut app = App::new(file_path()?, cfg);
    while !app.should_quit {
        tui.draw(&mut app)?;
        if let Some(event) = tui.next().await {
            update(event, &mut app, &tui);
        }
    }

    tui.exit()?;
    Ok(())
}

#[cfg(debug_assertions)]
fn file_path() -> Result<String> {
    let doc_dir = dirs_next::document_dir().expect("Failed to find documents directory");
    let file_name = {
        let seed = std::env::args()
            .collect::<Vec<_>>()
            .get(1)
            .is_some_and(|s| s.eq("seed"));
        if seed {
            SEED_FILE_NAME
        } else {
            DEFAULT_FILE_NAME
        }
    };
    let dir = format!("{}/{}", doc_dir.display(), "englog");
    std::fs::create_dir_all(&dir)?;
    Ok(format!("{}/{}", dir, file_name))
}

#[cfg(not(debug_assertions))]
fn file_path() -> Result<String> {
    let doc_dir = dirs_next::document_dir().expect("Failed to find documents directory");
    let dir = format!("{}/{}", doc_dir.display(), "englog");
    std::fs::create_dir_all(&dir)?;
    Ok(format!("{}/{}", dir, DEFAULT_FILE_NAME))
}