use clap::{Args, Parser, Subcommand};
use uuid::Uuid;
#[cfg(has_git_commit)]
const VERSION: &str = concat!(
env!("CARGO_PKG_VERSION"),
"\ncommit: ",
env!("GIT_COMMIT_HASH")
);
#[cfg(not(has_git_commit))]
const VERSION: &str = env!("CARGO_PKG_VERSION");
#[derive(Parser)]
#[command(name = "kanban")]
#[command(about = "A terminal-based kanban board", long_about = None)]
#[command(version = VERSION, arg_required_else_help = false)]
pub struct Cli {
#[arg(value_name = "FILE", env = "KANBAN_FILE")]
pub file: Option<String>,
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Subcommand)]
pub enum Commands {
Board(BoardCommand),
Column(ColumnCommand),
Card(CardCommand),
Sprint(SprintCommand),
Export(ExportArgs),
Import(ImportArgs),
Completions {
#[arg(value_enum)]
shell: clap_complete::Shell,
},
}
#[derive(Args)]
pub struct BoardCommand {
#[command(subcommand)]
pub action: BoardAction,
}
#[derive(Subcommand)]
pub enum BoardAction {
Create {
#[arg(long)]
name: String,
#[arg(long)]
card_prefix: Option<String>,
},
List {
#[arg(long)]
page: Option<u32>,
#[arg(long)]
page_size: Option<u32>,
},
Get {
id: Uuid,
},
Update(BoardUpdateArgs),
Delete {
id: Uuid,
},
}
#[derive(Args)]
pub struct BoardUpdateArgs {
pub id: Uuid,
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub description: Option<String>,
#[arg(long)]
pub sprint_prefix: Option<String>,
#[arg(long)]
pub card_prefix: Option<String>,
}
#[derive(Args)]
pub struct ColumnCommand {
#[command(subcommand)]
pub action: ColumnAction,
}
#[derive(Subcommand)]
pub enum ColumnAction {
Create {
#[arg(long)]
board_id: Uuid,
#[arg(long)]
name: String,
#[arg(long)]
position: Option<i32>,
},
List {
#[arg(long)]
board_id: Uuid,
#[arg(long)]
page: Option<u32>,
#[arg(long)]
page_size: Option<u32>,
},
Get {
id: Uuid,
},
Update(ColumnUpdateArgs),
Delete {
id: Uuid,
},
Reorder {
id: Uuid,
#[arg(long)]
position: i32,
},
}
#[derive(Args)]
pub struct ColumnUpdateArgs {
pub id: Uuid,
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub position: Option<i32>,
#[arg(long)]
pub wip_limit: Option<u32>,
#[arg(long)]
pub clear_wip_limit: bool,
}
#[derive(Args)]
pub struct CardCommand {
#[command(subcommand)]
pub action: CardAction,
}
#[derive(Subcommand)]
pub enum CardAction {
Create(CardCreateArgs),
List(CardListArgs),
Get {
id: String,
},
Update(CardUpdateArgs),
Move {
id: String,
#[arg(long)]
column_id: Uuid,
#[arg(long)]
position: Option<i32>,
},
Archive {
id: String,
},
Restore {
id: String,
#[arg(long)]
column_id: Option<Uuid>,
},
Delete {
id: String,
},
AssignSprint {
id: String,
#[arg(long)]
sprint_id: Uuid,
},
UnassignSprint {
id: String,
},
BranchName {
id: String,
},
GitCheckout {
id: String,
},
BulkArchive {
#[arg(long, value_delimiter = ',')]
ids: Vec<Uuid>,
},
BulkMove {
#[arg(long, value_delimiter = ',')]
ids: Vec<Uuid>,
#[arg(long)]
column_id: Uuid,
},
BulkAssignSprint {
#[arg(long, value_delimiter = ',')]
ids: Vec<Uuid>,
#[arg(long)]
sprint_id: Uuid,
},
}
#[derive(Args)]
pub struct CardCreateArgs {
#[arg(long)]
pub board_id: Uuid,
#[arg(long)]
pub column_id: Uuid,
#[arg(long)]
pub title: String,
#[arg(long)]
pub description: Option<String>,
#[arg(long)]
pub priority: Option<String>,
#[arg(long)]
pub points: Option<u8>,
#[arg(long)]
pub due_date: Option<String>,
}
#[derive(Args)]
pub struct CardListArgs {
#[arg(long)]
pub board_id: Option<Uuid>,
#[arg(long)]
pub column_id: Option<Uuid>,
#[arg(long)]
pub sprint_id: Option<Uuid>,
#[arg(long)]
pub status: Option<String>,
#[arg(long)]
pub archived: bool,
#[arg(long)]
pub page: Option<u32>,
#[arg(long)]
pub page_size: Option<u32>,
}
#[derive(Args)]
pub struct CardUpdateArgs {
pub id: String,
#[arg(long)]
pub title: Option<String>,
#[arg(long)]
pub description: Option<String>,
#[arg(long)]
pub priority: Option<String>,
#[arg(long)]
pub status: Option<String>,
#[arg(long)]
pub points: Option<u8>,
#[arg(long)]
pub due_date: Option<String>,
#[arg(long)]
pub clear_due_date: bool,
}
#[derive(Args)]
pub struct SprintCommand {
#[command(subcommand)]
pub action: SprintAction,
}
#[derive(Subcommand)]
pub enum SprintAction {
Create {
#[arg(long)]
board_id: Uuid,
#[arg(long)]
prefix: Option<String>,
#[arg(long)]
name: Option<String>,
},
List {
#[arg(long)]
board_id: Uuid,
#[arg(long)]
page: Option<u32>,
#[arg(long)]
page_size: Option<u32>,
},
Get {
id: Uuid,
},
Update(SprintUpdateArgs),
Activate {
id: Uuid,
#[arg(long)]
duration_days: Option<i32>,
},
Complete {
id: Uuid,
},
Cancel {
id: Uuid,
},
Delete {
id: Uuid,
},
}
#[derive(Args)]
pub struct SprintUpdateArgs {
pub id: Uuid,
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub prefix: Option<String>,
#[arg(long)]
pub card_prefix: Option<String>,
#[arg(long)]
pub start_date: Option<String>,
#[arg(long)]
pub end_date: Option<String>,
#[arg(long)]
pub clear_start_date: bool,
#[arg(long)]
pub clear_end_date: bool,
}
#[derive(Args)]
pub struct ExportArgs {
#[arg(long)]
pub board_id: Option<Uuid>,
}
#[derive(Args)]
pub struct ImportArgs {
#[arg(long)]
pub file: String,
}