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 {
#[arg(short, long)]
pub init: bool,
#[arg(short, long)]
pub read: bool,
#[arg(short, long)]
pub list: bool,
#[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(¤t_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(¤t_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),
}
}