use crate::model::{Battery, Component, Cpu, Disk, Network, Process};
use serde::de::DeserializeOwned;
use std::sync::Mutex;
use sysinfo::{
Components, CpuRefreshKind, Disks, Networks, Pid, ProcessRefreshKind, RefreshKind, System,
};
use tauri::{plugin::PluginApi, AppHandle, Runtime};
pub fn init<R: Runtime, C: DeserializeOwned>(
app: &AppHandle<R>,
_api: PluginApi<R, C>,
) -> crate::Result<SysInfoState> {
Ok(SysInfoState::default())
}
pub fn get_sys() -> System {
System::new_all()
}
pub struct SysInfoState {
pub sysinfo: Mutex<SysInfo>,
}
pub struct SysInfo {
pub sys: System,
}
impl Default for SysInfoState {
fn default() -> SysInfoState {
SysInfoState {
sysinfo: Mutex::new(SysInfo {
sys: System::new_all(),
}),
}
}
}
impl SysInfo {
pub fn refresh_all(&mut self) {
self.sys.refresh_all();
}
pub fn refresh_memory(&mut self) {
self.sys.refresh_memory();
}
pub fn refresh_cpu(&mut self) {
self.sys.refresh_cpu();
}
pub fn refresh_processes(&mut self) {
self.sys.refresh_processes();
}
pub fn refresh_process(&mut self, pid: Pid) {
self.sys.refresh_process(pid);
}
pub fn refresh_specifics(&mut self, refreshes: RefreshKind) {
self.sys.refresh_specifics(refreshes);
}
pub fn refresh_cpu_specifics(&mut self, refresh_kind: CpuRefreshKind) {
self.sys.refresh_cpu_specifics(refresh_kind);
}
pub fn refresh_processes_specifics(&mut self, refresh_kind: ProcessRefreshKind) {
self.sys.refresh_processes_specifics(refresh_kind);
}
pub fn refresh_process_specifics(&mut self, pid: Pid, refresh_kind: ProcessRefreshKind) {
self.sys.refresh_process_specifics(pid, refresh_kind);
}
pub fn hostname(&self) -> Option<String> {
System::host_name()
}
pub fn kernel_version(&self) -> Option<String> {
System::kernel_version()
}
pub fn os_version(&self) -> Option<String> {
System::os_version()
}
pub fn name(&self) -> Option<String> {
System::name()
}
pub fn total_memory(&mut self) -> u64 {
self.refresh_memory();
self.sys.total_memory()
}
pub fn used_memory(&mut self) -> u64 {
self.refresh_memory();
self.sys.used_memory()
}
pub fn total_swap(&mut self) -> u64 {
self.refresh_memory();
self.sys.total_swap()
}
pub fn used_swap(&mut self) -> u64 {
self.refresh_memory();
self.sys.used_swap()
}
pub fn cpus(&self) -> Vec<Cpu> {
self.sys.cpus().iter().map(|cpu| cpu.into()).collect()
}
pub fn cpu_count(&self) -> usize {
self.sys.cpus().len()
}
pub fn disks(&mut self) -> Vec<Disk> {
let disks = Disks::new_with_refreshed_list();
disks.iter().map(|disk| disk.into()).collect()
}
pub fn networks(&self) -> Vec<Network> {
let networks = Networks::new_with_refreshed_list();
networks
.into_iter()
.map(|(name, data)| Network::new(name, data))
.collect()
}
pub fn components(&self) -> Vec<Component> {
let components = Components::new_with_refreshed_list();
components
.iter()
.map(|component| component.into())
.collect()
}
pub fn processes(&self) -> Vec<Process> {
self.sys
.processes()
.iter()
.map(|(_, process)| process.into())
.collect()
}
pub fn batteries(&self) -> Result<Vec<Battery>, starship_battery::Error> {
let manager = starship_battery::Manager::new()?;
Ok(manager
.batteries()?
.filter_map(|maybe_battery| match maybe_battery {
Ok(battery) => Some(battery.into()),
Err(_) => None,
})
.collect())
}
}