jc-wrapper 0.2.1

A very simple wrapper for jc. Can be used directly on Command
Documentation
use serde::Deserialize;
use thiserror::Error;

mod jc;

/// Error types
#[derive(Error, Debug)]
pub enum Error {
    #[error("Command has no output")]
    NoOutput,
    #[error("Could not spawn jc. Please make sure it is installed")]
    CouldNotSpawnJc(std::io::Error),

    #[error("Command could not be spawned")]
    CouldNotSpawnCommand,

    #[error("Command output could not be parsed by jc")]
    CouldNotParse,
}

/// All commands which are supported
pub enum CmdOutput {
    Acpi,
    Airport,
    AirportS,
    Arp,
    Asciitable,
    AsciitableM,
    Blkid,
    Cbt,
    Cef,
    CefS,
    Chage,
    Cksum,
    Clf,
    ClfS,
    Crontab,
    CrontabU,
    Csv,
    Custom(String),
    Date,
    Df,
    Dig,
    Dir,
    Dmidecode,
    DpkgL,
    Du,
    EmailAddress,
    Env,
    File,
    Findmnt,
    Finger,
    Free,
    Fstab,
    GitLog,
    GitLsRemote,
    Gpg,
    Group,
    Gshadow,
    Hash,
    Hashsum,
    Hciconfig,
    Help,
    History,
    Hosts,
    Id,
    Ifconfig,
    Ini,
    Iostat,
    IostatS,
    IpAddress,
    Iptables,
    IsoDatetime,
    Iwconfig,
    IwScan,
    JarManifest,
    Jobs,
    Jwt,
    Kv,
    Last,
    Ls,
    Lsblk,
    Lsmod,
    Lsof,
    Lspci,
    LsS,
    Lsusb,
    M3u,
    Mdadm,
    Mount,
    Mpstat,
    MpstatS,
    Netstat,
    Nmcli,
    Ntpq,
    Openvpn,
    OsProber,
    Passwd,
    PciIds,
    Pgpass,
    Pidstat,
    PidstatS,
    Ping,
    PingS,
    PipList,
    PipShow,
    Plist,
    Postconf,
    Proc,
    ProcCpuinfo,
    ProcCrypto,
    ProcDiskstats,
    ProcInterrupts,
    ProcLocks,
    ProcModules,
    ProcMtrr,
    ProcNetDev,
    ProcNetDevMcast,
    ProcNetIgmp,
    ProcNetIgmp6,
    ProcNetNetlink,
    ProcNetNetstat,
    ProcNetPacket,
    ProcNetProtocols,
    ProcNetRoute,
    ProcNetUnix,
    ProcPartitions,
    ProcPidMaps,
    ProcPidMountinfo,
    ProcPidNumaMaps,
    ProcPidSmaps,
    ProcPidStat,
    ProcPidStatus,
    ProcSwaps,
    ProcVmallocinfo,
    Ps,
    Raw,
    Route,
    RpmQi,
    Rsync,
    Semver,
    Sfdisk,
    Shadow,
    Ss,
    SshdConf,
    Stat,
    StatS,
    Sysctl,
    Syslog,
    SyslogBsd,
    SyslogBsdS,
    SyslogS,
    Systemctl,
    SystemctlLj,
    SystemctlLs,
    SystemctlLuf,
    Systeminfo,
    Time,
    Timedatectl,
    Timestamp,
    Toml,
    Top,
    TopS,
    Tracepath,
    Traceroute,
    Udevadm,
    Ufw,
    UfwAppinfo,
    Uname,
    UpdateAltGs,
    UpdateAltQ,
    Upower,
    Uptime,
    Url,
    Vmstat,
    VmstatS,
    W,
    Wc,
    Who,
    X509Cert,
    Xml,
    Xrandr,
    Yaml,
    Zipinfo,
}

impl CmdOutput {
    pub(crate) fn get_flag(&self) -> &str {
        match self {
            Self::Acpi => "--acpi",
            Self::Airport => "--airport",
            Self::AirportS => "--airport-s",
            Self::Arp => "--arp",
            Self::Asciitable => "--asciitable",
            Self::AsciitableM => "--asciitable-m",
            Self::Blkid => "--blkid",
            Self::Cbt => "--cbt",
            Self::Cef => "--cef",
            Self::CefS => "--cef-s",
            Self::Chage => "--chage",
            Self::Cksum => "--cksum",
            Self::Clf => "--clf",
            Self::ClfS => "--clf-s",
            Self::Crontab => "--crontab",
            Self::CrontabU => "--crontab-u",
            Self::Csv => "--csv",
            Self::Custom(string) => string,
            Self::Date => "--date",
            Self::Df => "--df",
            Self::Dig => "--dig",
            Self::Dir => "--dir",
            Self::Dmidecode => "--dmidecode",
            Self::DpkgL => "--dpkg-l",
            Self::Du => "--du",
            Self::EmailAddress => "--email-address",
            Self::Env => "--env",
            Self::File => "--file",
            Self::Findmnt => "--findmnt",
            Self::Finger => "--finger",
            Self::Free => "--free",
            Self::Fstab => "--fstab",
            Self::GitLog => "--git-log",
            Self::GitLsRemote => "--git-ls-remote",
            Self::Gpg => "--gpg",
            Self::Group => "--group",
            Self::Gshadow => "--gshadow",
            Self::Hash => "--hash",
            Self::Hashsum => "--hashsum",
            Self::Hciconfig => "--hciconfig",
            Self::Help => "--help",
            Self::History => "--history",
            Self::Hosts => "--hosts",
            Self::Id => "--id",
            Self::Ifconfig => "--ifconfig",
            Self::Ini => "--ini",
            Self::Iostat => "--iostat",
            Self::IostatS => "--iostat-s",
            Self::IpAddress => "--ip-address",
            Self::Iptables => "--iptables",
            Self::IsoDatetime => "--iso-datetime",
            Self::Iwconfig => "--iwconfig",
            Self::IwScan => "--iw-scan",
            Self::JarManifest => "--jar-manifest",
            Self::Jobs => "--jobs",
            Self::Jwt => "--jwt",
            Self::Kv => "--kv",
            Self::Last => "--last",
            Self::Ls => "--ls",
            Self::Lsblk => "--lsblk",
            Self::Lsmod => "--lsmod",
            Self::Lsof => "--lsof",
            Self::Lspci => "--lspci",
            Self::LsS => "--ls-s",
            Self::Lsusb => "--lsusb",
            Self::M3u => "--m3u",
            Self::Mdadm => "--mdadm",
            Self::Mount => "--mount",
            Self::Mpstat => "--mpstat",
            Self::MpstatS => "--mpstat-s",
            Self::Netstat => "--netstat",
            Self::Nmcli => "--nmcli",
            Self::Ntpq => "--ntpq",
            Self::Openvpn => "--openvpn",
            Self::OsProber => "--os-prober",
            Self::Passwd => "--passwd",
            Self::PciIds => "--pci-ids",
            Self::Pgpass => "--pgpass",
            Self::Pidstat => "--pidstat",
            Self::PidstatS => "--pidstat-s",
            Self::Ping => "--ping",
            Self::PingS => "--ping-s",
            Self::PipList => "--pip-list",
            Self::PipShow => "--pip-show",
            Self::Plist => "--plist",
            Self::Postconf => "--postconf",
            Self::Proc => "--proc",
            Self::ProcCpuinfo => "--proc_cpuinfo",
            Self::ProcCrypto => "--proc_crypto",
            Self::ProcDiskstats => "--proc_diskstats",
            Self::ProcInterrupts => "--proc-interrupts",
            Self::ProcLocks => "--proc-locks",
            Self::ProcModules => "--proc-modules",
            Self::ProcMtrr => "--proc-mtrr",
            Self::ProcNetDev => "--proc-net-dev",
            Self::ProcNetDevMcast => "--proc-net-dev-mcast",
            Self::ProcNetIgmp => "--proc-net-igmp",
            Self::ProcNetIgmp6 => "--proc-net-igmp6",
            Self::ProcNetNetlink => "--proc-net-netlink",
            Self::ProcNetNetstat => "--proc-net-netstat",
            Self::ProcNetPacket => "--proc-net-packet",
            Self::ProcNetProtocols => "--proc-net-protocols",
            Self::ProcNetRoute => "--proc-net-route",
            Self::ProcNetUnix => "--proc-net-unix",
            Self::ProcPartitions => "--proc-partitions",
            Self::ProcPidMaps => "--proc-pid-maps",
            Self::ProcPidMountinfo => "--proc-pid-mountinfo",
            Self::ProcPidNumaMaps => "--proc-pid-numa-maps",
            Self::ProcPidSmaps => "--proc-pid-smaps",
            Self::ProcPidStat => "--proc-pid-stat",
            Self::ProcPidStatus => "--proc-pid-status",
            Self::ProcSwaps => "--proc-swaps",
            Self::ProcVmallocinfo => "--proc-vmallocinfo",
            Self::Ps => "--ps",
            Self::Raw => "--raw`",
            Self::Route => "--route",
            Self::RpmQi => "--rpm-qi",
            Self::Rsync => "--rsync",
            Self::Semver => "--semver",
            Self::Sfdisk => "--sfdisk",
            Self::Shadow => "--shadow",
            Self::Ss => "--ss",
            Self::SshdConf => "--sshd-conf",
            Self::Stat => "--stat",
            Self::StatS => "--stat-s",
            Self::Sysctl => "--sysctl",
            Self::Syslog => "--syslog",
            Self::SyslogBsd => "--syslog-bsd",
            Self::SyslogBsdS => "--syslog-bsd-s",
            Self::SyslogS => "--syslog-s",
            Self::Systemctl => "--systemctl",
            Self::SystemctlLj => "--systemctl-lj",
            Self::SystemctlLs => "--systemctl-ls",
            Self::SystemctlLuf => "--systemctl-luf",
            Self::Systeminfo => "--systeminfo",
            Self::Time => "--time",
            Self::Timedatectl => "--timedatectl",
            Self::Timestamp => "--timestamp",
            Self::Toml => "--toml",
            Self::Top => "--top",
            Self::TopS => "--top-s",
            Self::Tracepath => "--tracepath",
            Self::Traceroute => "--traceroute",
            Self::Udevadm => "--udevadm",
            Self::Ufw => "--ufw",
            Self::UfwAppinfo => "--ufw-appinfo",
            Self::Uname => "--uname",
            Self::UpdateAltGs => "--update-alt-gs",
            Self::UpdateAltQ => "--update-alt-q",
            Self::Upower => "--upower",
            Self::Uptime => "--uptime",
            Self::Url => "--url",
            Self::Vmstat => "--vmstat",
            Self::VmstatS => "--vmstat-s",
            Self::W => "--w",
            Self::Wc => "--wc",
            Self::Who => "--who",
            Self::X509Cert => "--x509-cert",
            Self::Xml => "--xml",
            Self::Xrandr => "--xrandr",
            Self::Yaml => "--yaml",
            Self::Zipinfo => "--zipinfo",
        }
    }
}

pub trait JcWrapper<T> where T: for<'a> Deserialize<'a> {
    fn parse(&mut self, output_type: CmdOutput) -> Result<T, Error>;
}