use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "giti")]
#[command(
author,
version,
about = "A CLI tool to get git repository information"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Subcommand)]
pub enum Commands {
Clone {
url: Option<String>,
},
Info(InfoArgs),
Open(OpenArgs),
}
#[derive(Parser, Default)]
#[expect(
clippy::struct_excessive_bools,
reason = "Many bools make sense for CLI flags"
)]
pub struct InfoArgs {
#[arg(short = 'r', long = "repo-urls")]
pub repo_urls: bool,
#[arg(short = 'u', long = "last-update")]
pub last_update: bool,
#[arg(short = 'f', long = "last-fetch")]
pub last_fetch: bool,
#[arg(short = 'g', long = "repo-size")]
pub repo_size: bool,
#[arg(short = 's', long = "size")]
pub size: bool,
#[arg(short = 't', long = "tsv")]
pub tsv: bool,
pub paths: Vec<PathBuf>,
}
impl InfoArgs {
pub fn setup_defaults(&mut self) {
if !self.repo_urls && !self.last_update && !self.last_fetch && !self.repo_size && !self.size
{
self.repo_urls = true;
self.last_update = true;
self.last_fetch = true;
self.repo_size = true;
self.size = true;
}
}
}
#[derive(Parser)]
pub struct OpenArgs {
#[arg(value_enum, default_value = "repo")]
pub page: OpenPage,
#[arg(long = "forge", visible_alias = "service", visible_alias = "site")]
pub forge: Option<String>,
#[arg(short = 'r', long = "remote", default_value = "origin")]
pub remote: String,
pub path: Option<PathBuf>,
}
#[derive(ValueEnum, Clone, Default, Debug)]
pub enum OpenPage {
#[default]
Repo,
Code,
#[value(alias = "org")]
Author,
Issues,
#[value(alias = "pull-requests", alias = "prs", alias = "mrs")]
Pulls,
Wiki,
Commits,
Branches,
Tags,
Releases,
}