grom 0.3.0

CLI for Note Taking
Documentation
use std::process;
use clap::{Parser, Subcommand};
use grom::commands::{diary, project, quick_note, sync};
use grom::core::config;

#[derive(Parser)]
#[command(name = "grom")]
#[command(author = "alwaysamer")]
#[command(version = "1.0")]
#[command(about = "Note-Taking")]
struct Cli {
    #[command(subcommand)]
    command: Option<Command>,
    project: Option<String>,
}

#[derive(Subcommand)]
enum Command {
    Quick {
        #[arg(value_name = "NOTE_NAME")]
        note_name: String,
    },
    New {
        #[arg(value_name = "PROJECT_NAME")]
        project_name: String,
    },
    Today {},
    Week {},
    Month {},
    Sync {
        #[command(subcommand)]
        command: SyncCommand,
    },
}

#[derive(Subcommand)]
enum SyncCommand {
    Init {
        #[arg(value_name = "REMOTE_URL")]
        remote_url: String,
    },
    Push {
        #[arg(value_name = "MESSAGE")]
        message: String,
    },
    Pull {},
}

fn main() {
    ctrlc::set_handler(move || {}).expect("settings ctrl-c handler");
    let cli = Cli::parse();
    let config = match config::load_config() {
        Ok(cfg) => cfg,
        Err(_) => {
            cliclack::note("T_T", "Unable to load config.").unwrap();
            process::exit(1);
        }
    };

    if let Some(command) = &cli.command {
        match &command {
            Command::Quick { note_name } => {
                if quick_note::quick_note(note_name, config).is_err() {
                    cliclack::note("T_T", "Unable to create quick note").unwrap();
                }
            },
            Command::Today {} => {
                if diary::daily_diary(config).is_err() {
                    cliclack::note("T_T", "Unable to create daily diary").unwrap();
                }
            },
            Command::Week {} => {
                if diary::weekly_diary(config).is_err() {
                    cliclack::note("T_T", "Unable to create weekly diary").unwrap();
                }
            },
            Command::Month {} => {
                if diary::monthly_diary(config).is_err() {
                    cliclack::note("T_T", "Unable to create monthly diary").unwrap();
                }
            },
            Command::New { project_name } => {
                if project::create(project_name.clone(), config).is_err() {
                    cliclack::note("T_T", "Unable to create project").unwrap();
                }
            },
            Command::Sync { command } => {
                match command {
                    SyncCommand::Init { remote_url } => {
                        if sync::init(remote_url.clone(), config).is_err() {
                            cliclack::note("T_T", "Unable to initialize sync.").unwrap();
                        }
                    }
                    SyncCommand::Push { message } => {
                        if sync::push(message.clone(), config).is_err() {
                            cliclack::note("T_T", "Unable to push changes.").unwrap();
                        }
                    }
                    SyncCommand::Pull {} => {
                        if sync::pull(config).is_err() {
                            cliclack::note("T_T", "Unable to pull changes.").unwrap();
                        }
                    }
                }
            }
        }
    } else if let Some(project) = &cli.project {
        if project::open(project.clone(), config).is_err() {
            cliclack::note("T_T", "Unable to open project").unwrap();
        }
    } else if project::interactive_selecion(config).is_err() {
        cliclack::note("T_T", "Unable to open project").unwrap();
    }
}