mod common;
mod completions;
mod doctor;
mod files;
mod info;
pub mod packages;
mod profiles;
mod sync;
mod upgrade;
pub use common::*;
pub use packages::PackagesCommand;
use anyhow::Result;
use clap::{Parser, Subcommand};
use clap_complete::Shell;
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "dotstate", version, about = "A friendly TUI tool for managing dotfiles with GitHub sync", long_about = None, disable_help_subcommand = true, arg_required_else_help = false)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
#[arg(long, global = true)]
pub no_colors: bool,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Sync {
#[arg(short, long)]
message: Option<String>,
},
List {
#[arg(short, long)]
verbose: bool,
},
Add {
path: PathBuf,
#[arg(long)]
common: bool,
},
Remove {
path: String,
#[arg(long)]
common: bool,
},
Activate,
Deactivate,
Profile {
#[command(subcommand)]
command: Option<ProfileCommand>,
},
Doctor {
#[arg(long)]
fix: bool,
#[arg(short, long)]
verbose: bool,
#[arg(long)]
json: bool,
},
Logs,
Config,
Repository,
Help {
command: Option<String>,
},
Upgrade {
#[arg(long)]
check: bool,
},
Packages {
#[command(subcommand)]
command: PackagesCommand,
},
#[clap(alias = "completion")]
Completions {
shell: Option<Shell>,
},
}
#[derive(Subcommand, Debug, Clone, PartialEq, Eq, Default)]
pub enum ProfileCommand {
#[default]
Current,
List,
Switch {
name: String,
},
}
impl Cli {
pub fn execute(self) -> Result<()> {
match self.command {
Some(Commands::Sync { message }) => sync::execute(message),
Some(Commands::List { verbose }) => files::cmd_list(verbose),
Some(Commands::Add { path, common }) => files::cmd_add(path, common),
Some(Commands::Remove { path, common }) => files::cmd_remove(path, common),
Some(Commands::Activate) => profiles::cmd_activate(),
Some(Commands::Deactivate) => profiles::cmd_deactivate(),
Some(Commands::Profile { command }) => profiles::execute(command.unwrap_or_default()),
Some(Commands::Doctor { fix, verbose, json }) => doctor::execute(fix, verbose, json),
Some(Commands::Help { command }) => info::cmd_help(command),
Some(Commands::Logs) => info::cmd_logs(),
Some(Commands::Config) => info::cmd_config(),
Some(Commands::Repository) => info::cmd_repository(),
Some(Commands::Upgrade { check }) => upgrade::execute(check),
Some(Commands::Packages { command }) => packages::execute(command),
Some(Commands::Completions { shell }) => completions::generate(shell),
None => {
Ok(())
}
}
}
}