use std::error::Error; use anyhow::Result; use sysinfo::System; /// # Memory Hardware Module /// /// This module provides memory information collection for WatcherAgent, including total, used, and free RAM. /// /// ## Responsibilities /// - **Memory Detection:** Queries system for total, used, and free RAM. /// - **Usage Calculation:** Computes memory usage percentage. /// - **Error Handling:** Graceful fallback if metrics are unavailable. /// /// ## Units /// - `total`, `used`, `free`: RAM in **bytes** /// /// Memory statistics for the host system. /// /// # Fields /// - `total`: Total RAM in **bytes** /// - `used`: Used RAM in **bytes** /// - `free`: Free RAM in **bytes** #[derive(Debug)] pub struct MemoryInfo { pub total_size: Option, pub used: Option, pub free: Option, pub current_load: Option, } /// Collects memory information (total, used, free RAM). /// /// # Returns /// * `Result` - Memory statistics or error if unavailable. pub async fn get_memory_info() -> Result> { let mut sys = System::new(); sys.refresh_memory(); Ok(MemoryInfo { total_size: Some(sys.total_memory() as f64), used: Some(sys.used_memory() as f64), free: Some(sys.free_memory() as f64), current_load: Some(get_memory_usage(&mut sys).unwrap() as f64) }) } /// Computes memory usage percentage from sysinfo::System. /// /// # Arguments /// * `sys` - Mutable reference to sysinfo::System /// /// # Returns /// * `Result>` - Memory usage as percentage. pub fn get_memory_usage(sys: &mut System) -> Result> { sys.refresh_memory(); Ok((sys.used_memory() as f64 / sys.total_memory() as f64) * 100.0) }