use std::path::PathBuf;
use clap::Parser;
use log::debug;
use crate::themes;
use crate::utils;
#[derive(Parser)]
#[command(
name = "ublx",
version,
about = "UBLX is a TUI to index once, enrich with metadata, and browse a flat snapshot in a 3-pane layout with multiple modes."
)]
pub struct Args {
#[arg(value_name = "DIR", default_value = ".")]
pub dir_to_ublx: PathBuf,
#[command(flatten)]
pub headless: HeadlessCli,
#[arg(long = "dev")]
pub dev: bool,
#[arg(long = "themes")]
pub themes: bool,
}
#[derive(Parser)]
#[allow(clippy::struct_excessive_bools)]
pub struct HeadlessCli {
#[arg(long = "snapshot-only", short = 's')]
pub snapshot_only: bool,
#[arg(long = "enhance-all", short = 'e')]
pub enhance_all: bool,
#[arg(long = "full-snapshot", short = 'f')]
pub full_snapshot: bool,
#[arg(long = "export", short = 'x')]
pub export_zahir: bool,
}
pub fn print_available_themes() {
for entry in themes::theme_selector_entries() {
match entry {
themes::SelectorEntry::Section(label) => {
println!("{label}:");
}
themes::SelectorEntry::Item(theme) => {
println!(" - {}", theme.name);
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SnapshotType {
MinSnapshot { enhance_all: bool },
FullSnapshot,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct HeadlessModeFlags {
pub snapshot: Option<SnapshotType>,
pub export: bool,
}
impl HeadlessModeFlags {
#[must_use]
pub fn new(args_headless: &HeadlessCli) -> Self {
let snapshot = if args_headless.full_snapshot {
Some(SnapshotType::FullSnapshot)
} else if args_headless.snapshot_only {
Some(SnapshotType::MinSnapshot {
enhance_all: args_headless.enhance_all,
})
} else {
None
};
Self {
snapshot,
export: args_headless.export_zahir,
}
}
#[must_use]
pub fn is_headless(self) -> bool {
self.snapshot.is_some() || self.export
}
#[must_use]
pub fn determine_enhance_all(self) -> bool {
match self.snapshot {
Some(SnapshotType::FullSnapshot) => true,
Some(SnapshotType::MinSnapshot { enhance_all }) => enhance_all,
None => false,
}
}
}
#[must_use]
pub fn headless_handler(args_headless: &HeadlessCli) -> HeadlessModeFlags {
let flags = HeadlessModeFlags::new(args_headless);
if args_headless.full_snapshot && args_headless.enhance_all {
debug!("Full snapshot with --enhance-all is redundant; use --full-snapshot (-f) alone.");
}
utils::exit_if_enhance_all_without_headless(
args_headless.enhance_all,
flags.snapshot.is_some(),
);
flags
}