use crate::sys::{Component, Disk, Networks, Process, Processor};
use crate::{
DiskType, DiskUsage, LoadAvg, NetworksIter, Pid, ProcessStatus, RefreshKind, Signal, User,
};
use std::collections::HashMap;
use std::ffi::OsStr;
use std::fmt::Debug;
use std::path::Path;
pub trait DiskExt: Debug {
fn get_type(&self) -> DiskType;
fn get_name(&self) -> &OsStr;
fn get_file_system(&self) -> &[u8];
fn get_mount_point(&self) -> &Path;
fn get_total_space(&self) -> u64;
fn get_available_space(&self) -> u64;
fn refresh(&mut self) -> bool;
}
pub trait ProcessExt: Debug {
#[doc(hidden)]
fn new(pid: Pid, parent: Option<Pid>, start_time: u64) -> Self;
fn kill(&self, signal: Signal) -> bool;
fn name(&self) -> &str;
fn cmd(&self) -> &[String];
fn exe(&self) -> &Path;
fn pid(&self) -> Pid;
fn environ(&self) -> &[String];
fn cwd(&self) -> &Path;
fn root(&self) -> &Path;
fn memory(&self) -> u64;
fn virtual_memory(&self) -> u64;
fn parent(&self) -> Option<Pid>;
fn status(&self) -> ProcessStatus;
fn start_time(&self) -> u64;
fn cpu_usage(&self) -> f32;
fn disk_usage(&self) -> DiskUsage;
}
pub trait ProcessorExt: Debug {
fn get_cpu_usage(&self) -> f32;
fn get_name(&self) -> &str;
fn get_vendor_id(&self) -> &str;
fn get_brand(&self) -> &str;
fn get_frequency(&self) -> u64;
}
pub trait SystemExt: Sized + Debug + Default {
fn new() -> Self {
Self::new_with_specifics(RefreshKind::new())
}
fn new_all() -> Self {
Self::new_with_specifics(RefreshKind::everything())
}
fn new_with_specifics(refreshes: RefreshKind) -> Self;
fn refresh_specifics(&mut self, refreshes: RefreshKind) {
if refreshes.memory() {
self.refresh_memory();
}
if refreshes.cpu() {
self.refresh_cpu();
}
if refreshes.components_list() {
self.refresh_components_list();
} else if refreshes.components() {
self.refresh_components();
}
if refreshes.networks_list() {
self.refresh_networks_list();
} else if refreshes.networks() {
self.refresh_networks();
}
if refreshes.processes() {
self.refresh_processes();
}
if refreshes.disks_list() {
self.refresh_disks_list();
} else if refreshes.disks() {
self.refresh_disks();
}
if refreshes.users_list() {
self.refresh_users_list();
}
}
fn refresh_system(&mut self) {
self.refresh_memory();
self.refresh_cpu();
self.refresh_components();
}
fn refresh_memory(&mut self);
fn refresh_cpu(&mut self);
fn refresh_components(&mut self) {
for component in self.get_components_mut() {
component.refresh();
}
}
fn refresh_components_list(&mut self);
fn refresh_processes(&mut self);
fn refresh_process(&mut self, pid: Pid) -> bool;
fn refresh_disks(&mut self) {
for disk in self.get_disks_mut() {
disk.refresh();
}
}
fn refresh_disks_list(&mut self);
fn refresh_users_list(&mut self);
fn refresh_networks(&mut self) {
self.get_networks_mut().refresh();
}
fn refresh_networks_list(&mut self) {
self.get_networks_mut().refresh_networks_list();
}
fn refresh_all(&mut self) {
self.refresh_system();
self.refresh_processes();
self.refresh_disks();
self.refresh_networks();
}
fn get_processes(&self) -> &HashMap<Pid, Process>;
fn get_process(&self, pid: Pid) -> Option<&Process>;
fn get_process_by_name(&self, name: &str) -> Vec<&Process> {
let mut ret = vec![];
for val in self.get_processes().values() {
if val.name().contains(name) {
ret.push(val);
}
}
ret
}
fn get_global_processor_info(&self) -> &Processor;
fn get_processors(&self) -> &[Processor];
fn get_physical_core_count(&self) -> Option<usize>;
fn get_total_memory(&self) -> u64;
fn get_free_memory(&self) -> u64;
fn get_available_memory(&self) -> u64;
fn get_used_memory(&self) -> u64;
fn get_total_swap(&self) -> u64;
fn get_free_swap(&self) -> u64;
fn get_used_swap(&self) -> u64;
fn get_components(&self) -> &[Component];
fn get_components_mut(&mut self) -> &mut [Component];
fn get_disks(&self) -> &[Disk];
fn get_users(&self) -> &[User];
fn get_disks_mut(&mut self) -> &mut [Disk];
fn get_networks(&self) -> &Networks;
fn get_networks_mut(&mut self) -> &mut Networks;
fn get_uptime(&self) -> u64;
fn get_boot_time(&self) -> u64;
fn get_load_average(&self) -> LoadAvg;
fn get_name(&self) -> Option<String>;
fn get_kernel_version(&self) -> Option<String>;
fn get_os_version(&self) -> Option<String>;
fn get_host_name(&self) -> Option<String>;
}
pub trait NetworkExt: Debug {
fn get_received(&self) -> u64;
fn get_total_received(&self) -> u64;
fn get_transmitted(&self) -> u64;
fn get_total_transmitted(&self) -> u64;
fn get_packets_received(&self) -> u64;
fn get_total_packets_received(&self) -> u64;
fn get_packets_transmitted(&self) -> u64;
fn get_total_packets_transmitted(&self) -> u64;
fn get_errors_on_received(&self) -> u64;
fn get_total_errors_on_received(&self) -> u64;
fn get_errors_on_transmitted(&self) -> u64;
fn get_total_errors_on_transmitted(&self) -> u64;
}
pub trait NetworksExt: Debug {
fn iter(&self) -> NetworksIter;
fn refresh_networks_list(&mut self);
fn refresh(&mut self);
}
pub trait ComponentExt: Debug {
fn get_temperature(&self) -> f32;
fn get_max(&self) -> f32;
fn get_critical(&self) -> Option<f32>;
fn get_label(&self) -> &str;
fn refresh(&mut self);
}
pub trait UserExt: Debug {
fn get_name(&self) -> &str;
fn get_groups(&self) -> &[String];
}