granger 0.1.0

An opinionated Kanban Board for the solo developer
Documentation
use crate::board;
use crate::board::model::Board;
use crate::common;
use clap::Parser;
use std::env::current_dir;

#[derive(Debug, Parser)]
pub struct BoardCli {
    /// Initialize a Board in current working directory
    #[arg(short, long)]
    pub init: bool,

    /// View Board in current working directory
    #[arg(short, long)]
    pub read: bool,

    /// List all Boards on system
    #[arg(short, long)]
    pub list: bool,

    /// Delete Board in current working directory
    #[arg(short, long)]
    pub delete: bool,
}

impl BoardCli {
    pub fn parse_options(self) {
        if self.init {
            initialize_board();
        }
        if self.read {
            display_board();
        }
        if self.list {
            list_boards();
        }
        if self.delete {
            delete_board();
        }
    }
}

fn initialize_board() {
    let current_working_directory =
        current_dir().expect("Failed to get current working directory.");

    let path_to_git_repository: String =
        common::get_root_path_if_git_repository(&current_working_directory)
            .expect("Error propagated");

    let git_repository_name = common::get_git_repository_name(&path_to_git_repository);

    let board = Board::new(&git_repository_name, &path_to_git_repository);

    match board::data::add(&board) {
        Ok(_) => println!(
            "'{}' board has been created at '{}'.",
            git_repository_name, path_to_git_repository
        ),
        Err(value) => println!(
            "Error creating '{}' board at '{}': {}",
            git_repository_name, path_to_git_repository, value
        ),
    }
}

fn display_board() {
    let board = common::get_current_board();
    println!("{:#?}", board);
}

fn list_boards() {
    let boards = board::data::get_all()
        .expect("Failed to retrieve boards after calling 'granger board --list'.");

    for board in boards {
        println!("Board: {}\nLocation: {}\n", board.name, board.location);
    }
}

fn delete_board() {
    let current_working_directory =
        current_dir().expect("Failed to get current working directory.");

    let path_to_git_repository =
        common::get_root_path_if_git_repository(&current_working_directory)
            .expect("Error propagated");

    let board = board::data::get_by_location(&path_to_git_repository).expect(
        "Error getting board by location. Ensure you called delete from inside a git repository.",
    );

    match board::data::delete(board.id) {
        Ok(_) => println!("{:?} board successfully deleted.", board.name),
        Err(value) => println!("{:?}", value),
    }
}