use nix::sys::statvfs::statvfs; use std::env; use std::fs::File; use std::io::{self, BufRead}; use std::path::Path; use std::process::Command; use crate::colors::{CYAN, GREEN, RED, RESET, YELLOW}; pub fn get_username_and_hostname() -> Result { let username = env::var("USER").unwrap_or_else(|_| "unknown_user".to_string()); let output = Command::new("hostname").output()?; let hostname = String::from_utf8_lossy(&output.stdout).trim().to_string(); Ok(format!("{YELLOW}{username}{RED}@{GREEN}{hostname}")) } pub fn get_root_disk_usage() -> Result> { let vfs = statvfs("/")?; let block_size = vfs.block_size() as u64; let total_blocks = vfs.blocks(); let available_blocks = vfs.blocks_available(); let total_size = block_size * total_blocks; let used_size = total_size - (block_size * available_blocks); let total_size_gib = total_size as f64 / (1024.0 * 1024.0 * 1024.0); let used_size_gib = used_size as f64 / (1024.0 * 1024.0 * 1024.0); let usage_percentage = (used_size as f64 / total_size as f64) * 100.0; Ok(format!( "{used_size_gib:.2} GiB / {total_size_gib:.2} GiB ({CYAN}{usage_percentage:.0}%{RESET})" )) } pub fn get_memory_usage() -> Result { fn parse_memory_info() -> Result<(f64, f64), io::Error> { let path = Path::new("/proc/meminfo"); let file = File::open(path)?; let reader = io::BufReader::new(file); let mut total_memory_kb = 0.0; let mut available_memory_kb = 0.0; for line in reader.lines() { let line = line?; if line.starts_with("MemTotal:") { total_memory_kb = line .split_whitespace() .nth(1) .ok_or_else(|| { io::Error::new(io::ErrorKind::InvalidData, "Failed to parse MemTotal") })? .parse::() .unwrap_or(0.0); } else if line.starts_with("MemAvailable:") { available_memory_kb = line .split_whitespace() .nth(1) .ok_or_else(|| { io::Error::new(io::ErrorKind::InvalidData, "Failed to parse MemAvailable") })? .parse::() .unwrap_or(0.0); } } let total_memory_gb = total_memory_kb / (1024.0 * 1024.0); let available_memory_gb = available_memory_kb / (1024.0 * 1024.0); let used_memory_gb = total_memory_gb - available_memory_gb; Ok((used_memory_gb, total_memory_gb)) } let (used_memory, total_memory) = parse_memory_info()?; let percentage_used = (used_memory / total_memory * 100.0).round() as u64; Ok(format!( "{used_memory:.2} GiB / {total_memory:.2} GiB ({CYAN}{percentage_used}%{RESET})" )) }