granger 0.1.0

An opinionated Kanban Board for the solo developer
Documentation
pub mod common;
use std::fs::OpenOptions;
use std::path::PathBuf;

use clap::Parser;
use color_eyre::eyre::Result;

mod state;

pub mod database;
use crate::database::{get_granger_data_directory, initialize};

pub mod board;
use crate::board::cli::BoardCli;

pub mod ticket;
use crate::ticket::cli::TicketCli;

#[derive(Debug)]
pub enum Env {
    Test,
    Prod,
}

const TICKET_TEMPLATE_CONTENTS: &str = "# Insert TITLE and DESCRIPTION in empty line between quotes.\n# See https://toml.io/en/v1.0.0#string for more information.\n\ntitle = \"\"\"\n\n\"\"\"\n\ndescription = \"\"\"\n\n\"\"\"\n";

fn create_ticket_template_file() {
    let data_directory = get_granger_data_directory();

    let ticket_template_file = data_directory.join("ticket_template.toml");

    OpenOptions::new()
        .create(true)
        .read(true)
        .write(true)
        .open(&ticket_template_file)
        .expect("Failed to find laydown data file");

    std::fs::write(ticket_template_file, TICKET_TEMPLATE_CONTENTS).unwrap();
}

fn get_ticket_template_file() -> PathBuf {
    let data_directory = get_granger_data_directory();

    data_directory.join("ticket_template.toml")
}

#[derive(Debug, Parser)]
pub enum Cli {
    /// Board help message goes here
    Board(BoardCli),
    /// Ticket help message goes here
    Ticket(TicketCli),
}

pub fn get_args() -> Result<Cli> {
    let args = Cli::parse();
    Ok(args)
}

pub fn run(env: Env) -> Result<()> {
    create_ticket_template_file();

    initialize(env).expect("Failed to initialize database.");

    let args = get_args()?;

    match args {
        Cli::Board(board) => board.parse_options(),
        Cli::Ticket(ticket) => ticket.parse_options(),
    }
    Ok(())
}