use serde::Deserialize;
use thiserror::Error;
mod jc;
#[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,
}
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>;
}