updt 0.2.4

Cross-platform update helper for npm, cargo, rustup, fnm, scoop, Homebrew, paru, flatpak, pacman, and pkg.
mod target;

pub use target::{
    TARGET_IDS, section_title, target_enabled, target_label, target_state_flags,
    target_update_summary, updatable_items_for_target,
};

#[derive(Clone, Copy)]
pub struct TargetStateFlags {
    pub enabled: bool,
    pub installed: bool,
    pub check_failed: bool,
    pub has_updates: bool,
    pub needs_cargo_updater: bool,
}

#[derive(Clone, Copy, PartialEq, Eq, Default)]
pub enum SystemProfile {
    #[default]
    Unknown,
    Windows,
    Macos,
    Arch,
    Termux,
}

#[derive(Default, Clone)]
pub struct TargetBucketState {
    pub installed: bool,
    pub has_updates: bool,
    pub check_failed: bool,
    pub updatable_items: Vec<String>,
}

#[derive(Default, Clone)]
pub struct BrewState {
    pub installed: bool,
    pub has_updates: bool,
    pub check_failed: bool,
    pub formula_list: Vec<String>,
    pub cask_list: Vec<String>,
}

#[derive(Default, Clone)]
pub struct CargoState {
    pub installed: bool,
    pub has_updates: bool,
    pub check_failed: bool,
    pub updater_installed: bool,
    pub updatable_packages: Vec<String>,
}

#[derive(Default, Clone)]
pub struct EnablePolicy {
    pub brew: bool,
    pub npm: bool,
    pub cargo: bool,
    pub rustup: bool,
    pub fnm: bool,
    pub scoop: bool,
    pub paru: bool,
    pub pacman: bool,
    pub flatpak: bool,
    pub pkg: bool,
}

#[derive(Default, Clone)]
pub struct AppState {
    pub brew: BrewState,
    pub npm: TargetBucketState,
    pub cargo: CargoState,
    pub rustup: TargetBucketState,
    pub fnm: TargetBucketState,
    pub scoop: TargetBucketState,
    pub paru: TargetBucketState,
    pub flatpak: TargetBucketState,
    pub pacman: TargetBucketState,
    pub pkg: TargetBucketState,
    pub is_arch_linux: bool,
    pub is_termux: bool,
    pub system_profile: SystemProfile,
    pub enable: EnablePolicy,
}

pub fn profile_name(profile: SystemProfile) -> &'static str {
    const NAMES: &[(SystemProfile, &str)] = &[
        (SystemProfile::Unknown, "unknown"),
        (SystemProfile::Windows, "windows"),
        (SystemProfile::Macos, "macos"),
        (SystemProfile::Arch, "arch"),
        (SystemProfile::Termux, "termux"),
    ];
    NAMES
        .iter()
        .find(|(known, _)| *known == profile)
        .map(|(_, name)| *name)
        .unwrap_or("unknown")
}