monitr 0.3.38

A lightweight macOS activity monitor TUI built with Rust and Ratatui
use serde::Serialize;

use crate::sampler::ProcessRow;

#[derive(Debug, Clone, Serialize)]
pub struct ProcessRecord {
    pub pid: u32,
    pub parent_pid: Option<u32>,
    pub name: String,
    pub user: String,
    pub command: String,
    pub executable: String,
    pub cwd: String,
    pub status: String,
    pub cpu_usage_percent: f32,
    pub memory_bytes: u64,
    pub virtual_memory_bytes: u64,
    pub memory_percent: f64,
    pub disk_read_bytes_per_sec: f64,
    pub disk_write_bytes_per_sec: f64,
    pub total_disk_read_bytes: u64,
    pub total_disk_written_bytes: u64,
    pub network_in_bytes_per_sec: Option<f64>,
    pub network_out_bytes_per_sec: Option<f64>,
    pub total_network_read_bytes: Option<u64>,
    pub total_network_written_bytes: Option<u64>,
    pub runtime_seconds: u64,
    pub start_time_unix: u64,
    pub energy_impact: f64,
    pub thread_count: Option<usize>,
    pub open_files: Option<usize>,
    pub open_files_limit: Option<usize>,
    pub session_id: Option<u32>,
    pub priority: Option<i32>,
}

impl From<&ProcessRow> for ProcessRecord {
    fn from(process: &ProcessRow) -> Self {
        let details = process.selected_details.as_ref();
        Self {
            pid: process.pid,
            parent_pid: process.parent_pid,
            name: process.name.clone(),
            user: process.user.clone(),
            command: process.command.clone(),
            executable: process.exe.clone(),
            cwd: process.cwd.clone(),
            status: process.status.clone(),
            cpu_usage_percent: process.cpu_usage,
            memory_bytes: process.memory,
            virtual_memory_bytes: process.virtual_memory,
            memory_percent: process.memory_percent,
            disk_read_bytes_per_sec: process.disk_read_rate,
            disk_write_bytes_per_sec: process.disk_write_rate,
            total_disk_read_bytes: process.total_disk_read,
            total_disk_written_bytes: process.total_disk_write,
            network_in_bytes_per_sec: process.network_in_rate,
            network_out_bytes_per_sec: process.network_out_rate,
            total_network_read_bytes: process.total_network_in,
            total_network_written_bytes: process.total_network_out,
            runtime_seconds: process.run_time,
            start_time_unix: process.start_time,
            energy_impact: process.energy_impact,
            thread_count: details.and_then(|details| details.thread_count),
            open_files: details.and_then(|details| details.open_files),
            open_files_limit: details.and_then(|details| details.open_files_limit),
            session_id: details.and_then(|details| details.session_id),
            priority: details.and_then(|details| details.priority),
        }
    }
}