#[derive(Debug, Clone)]
pub enum ReadoutError {
MetricNotAvailable,
Other(String),
Warning(String),
}
impl ToString for ReadoutError {
fn to_string(&self) -> String {
match self {
ReadoutError::MetricNotAvailable => {
String::from("Metric is not available on this system.")
}
ReadoutError::Other(s) => s.clone(),
ReadoutError::Warning(s) => s.clone(),
}
}
}
impl From<&ReadoutError> for ReadoutError {
fn from(r: &ReadoutError) -> Self {
r.to_owned()
}
}
lazy_static! {
static ref STANDARD_NO_IMPL: ReadoutError = ReadoutError::Warning(String::from(
"This metric is not available on this platform or is not yet implemented by Macchina."
));
}
pub trait BatteryReadout {
fn new() -> Self;
fn percentage(&self) -> Result<u8, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn status(&self) -> Result<BatteryState, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
}
pub trait KernelReadout {
fn new() -> Self;
fn os_release(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn os_type(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn pretty_kernel(&self) -> Result<String, ReadoutError> {
let os_type = self.os_type().unwrap_or_default();
let os_release = self.os_release().unwrap_or_default();
if !(os_type.is_empty() || os_release.is_empty()) {
return Ok(format!("{} {}", os_type, os_release));
}
Err(ReadoutError::MetricNotAvailable)
}
}
pub trait MemoryReadout {
fn new() -> Self;
fn total(&self) -> Result<u64, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn free(&self) -> Result<u64, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn buffers(&self) -> Result<u64, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn cached(&self) -> Result<u64, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn reclaimable(&self) -> Result<u64, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn used(&self) -> Result<u64, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
}
pub trait PackageReadout {
fn new() -> Self;
fn count_pkgs(&self) -> Vec<(PackageManager, usize)> {
Vec::new()
}
}
pub trait ProductReadout {
fn new() -> Self;
fn version(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn vendor(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn family(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn name(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn product(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
}
pub trait GeneralReadout {
fn new() -> Self;
fn username(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn hostname(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn distribution(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn local_ip(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn desktop_environment(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn window_manager(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn terminal(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn shell(&self, _shorthand: ShellFormat) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn cpu_model_name(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn cpu_usage(&self) -> Result<usize, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn cpu_physical_cores(&self) -> Result<usize, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn cpu_cores(&self) -> Result<usize, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn uptime(&self) -> Result<usize, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn machine(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
fn os_name(&self) -> Result<String, ReadoutError> {
Err(STANDARD_NO_IMPL.clone())
}
}
pub enum BatteryState {
Charging,
Discharging,
}
impl Into<&'static str> for BatteryState {
fn into(self) -> &'static str {
match self {
BatteryState::Charging => "Charging",
BatteryState::Discharging => "Discharging",
}
}
}
#[derive(Debug)]
pub enum ShellFormat {
Relative,
Absolute,
}
pub enum PackageManager {
Homebrew,
MacPorts,
Pacman,
Portage,
Dpkg,
Opkg,
Xbps,
Pkgsrc,
Apk,
Eopkg,
Rpm,
Cargo,
Flatpak,
Snap,
}
impl ToString for PackageManager {
fn to_string(&self) -> String {
String::from(match self {
PackageManager::Homebrew => "Homebrew",
PackageManager::MacPorts => "MacPorts",
PackageManager::Pacman => "pacman",
PackageManager::Portage => "portage",
PackageManager::Dpkg => "dpkg",
PackageManager::Opkg => "opkg",
PackageManager::Xbps => "xbps",
PackageManager::Pkgsrc => "pkgsrc",
PackageManager::Apk => "apk",
PackageManager::Eopkg => "eopkg",
PackageManager::Rpm => "rpm",
PackageManager::Cargo => "cargo",
PackageManager::Flatpak => "flatpak",
PackageManager::Snap => "snap",
})
}
}