taskly 0.1.4

A Todo app made in rust to keep track of all your tasks.
Documentation
use std::{
    error::Error,
    fmt::Display,
    fs::{self},
    process,
};

use owo_colors::OwoColorize;
use rusqlite::Connection;
pub enum FlagArgs {
    CompletedOnly,
    UncompletedOnly,
    All,
}
#[derive(Debug)]
pub enum NonFlagArgs<'a> {
    Help,
    List,
    Add(Option<&'a str>),
    Remove(Option<&'a str>),
    Edit(Option<&'a str>),
    Done(Option<&'a str>),
    Undone(Option<&'a str>),
    Clear,
}

pub struct Todo {
    pub id: isize,
    pub name: String,
    pub status: String,
}
impl Display for Todo {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_fmt(format_args!(
            "{0: <5}  {1: <20}  {2: <9}",
            self.id, self.name, self.status
        ))
    }
}

pub fn unwrap_arg_or_quit<'a>(val: &'a Option<&'a str>) -> &'a str {
    val.unwrap_or_else(|| {
        println!("{}", "Insufficient Arguments Provided!".bright_red());
        println!("Run todo help for information on commands");
        process::exit(1)
    })
}
pub fn get_db_conn() -> Result<Connection, Box<dyn Error>> {
    let home_dir = match dirs::home_dir() {
        Some(path) => path,
        None => {
            eprintln!("Failed to get home directory");
            process::exit(1);
        }
    };
    let directory_name = ".todo";
    let directory_path = home_dir.join(directory_name);
    fs::create_dir_all(&directory_path)?;
    let db_path = directory_path.join("todo.db");
    let conn = Connection::open(db_path)?;
    conn.execute(
        "CREATE TABLE IF NOT EXISTS todo (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            status TEXT DEFAULT 'TODO' CHECK(status IN ('TODO', 'COMPLETED'))
        );",
        (),
    )?;
    Ok(conn)
}