shifty 0.1.7

A simple cli tool to keep track of your shifts at work
Documentation
use colored::Colorize;
use core::panic;
use directories::ProjectDirs;
use std::fs;

mod parse;

pub mod args;
use args::get_args;

mod shifts;
use shifts::Shifts;

mod utils;
use utils::{add_shift, list_all_shifts, list_shifts, remove_shift};

mod config;
use config::Config;

mod formaters;

fn main() {
    let project_dirs = ProjectDirs::from("com", "tomkol", "shifty").expect("Config path not found");
    if !fs::metadata(project_dirs.config_dir().to_str().unwrap()).is_ok() {
        fs::create_dir_all(project_dirs.config_dir().to_str().unwrap()).unwrap();
    }
    let config_file = match fs::read_to_string(&format!(
        "{}/config.json",
        project_dirs.config_dir().to_str().unwrap()
    )) {
        Ok(conf) => conf,
        Err(err) => match err.kind() {
            std::io::ErrorKind::NotFound => {
                println!("No config file found creating one.");
                Config::new(project_dirs.config_dir().to_str().unwrap().to_string());
                return;
            }
            _ => panic!("{}", err),
        },
    };
    let config: Config = serde_json::from_str(&config_file).expect("Error reading config");
    let args = get_args();
    let db_path = format!("{}/db.csv", project_dirs.config_dir().to_str().unwrap());
    let db = Shifts::from_file(db_path.clone());

    if args.add {
        if args.list || args.list_all || args.remove {
            panic!("'--list', '--list-all', '--remove', '--add' can only be used independently");
        }
        add_shift(args, db, db_path, config);
    } else if args.remove {
        if args.list || args.list_all || args.add {
            panic!("'--list', '--list-all', '--remove', '--add' can only be used independently");
        }
        remove_shift(args, db, db_path);
    } else if args.list_all {
        if args.list || args.remove || args.add {
            panic!("'--list', '--list-all', '--remove', '--add' can only be used independently");
        }
        println!("{}", list_all_shifts(args, db, config));
    } else if args.list {
        if args.list_all || args.remove || args.add {
            panic!("'--list', '--list-all', '--remove', '--add' can only be used independently");
        }
        println!("{}", list_shifts(args, db, config));
    } else if args.change_config {
        Config::new(project_dirs.config_dir().to_str().unwrap().to_string());
    } else if args.show_config {
        println!("{}", config);
    } else if args.stats {
        println!("{}", Shifts::stats(&db, config, args));
    } else {
        eprintln!(
            "{}-h,--help\n-a,--add\n-r,--remove\n-l,--list\n-L,--list-all\n",
            "No cli arguments found.\nyou must choose an action with one of these commands:\n\n"
                .red()
        );
    }
}