riscfetch_core/
system.rs

1//! General system information (memory, uptime, kernel, OS)
2
3use std::fs;
4use std::process::Command;
5use sysinfo::System;
6
7/// Get memory usage as formatted string
8pub fn get_memory_info() -> String {
9    let mut sys = System::new();
10    sys.refresh_memory();
11
12    let total_mem = sys.total_memory();
13    let used_mem = sys.used_memory();
14
15    let total_gb = total_mem as f64 / 1_073_741_824.0;
16    let used_gb = used_mem as f64 / 1_073_741_824.0;
17
18    format!("{used_gb:.2} GiB / {total_gb:.2} GiB")
19}
20
21/// Get memory information as bytes
22pub fn get_memory_bytes() -> (u64, u64) {
23    let mut sys = System::new();
24    sys.refresh_memory();
25    (sys.used_memory(), sys.total_memory())
26}
27
28/// Get kernel version
29pub fn get_kernel_info() -> String {
30    if let Ok(output) = Command::new("uname").arg("-r").output() {
31        let kernel = String::from_utf8_lossy(&output.stdout).trim().to_string();
32        if !kernel.is_empty() {
33            return kernel;
34        }
35    }
36    "Unknown".to_string()
37}
38
39/// Get OS name from /etc/os-release
40pub fn get_os_info() -> String {
41    if let Ok(content) = fs::read_to_string("/etc/os-release") {
42        for line in content.lines() {
43            if line.starts_with("PRETTY_NAME=") {
44                if let Some(name) = line.split('=').nth(1) {
45                    return name.trim_matches('"').to_string();
46                }
47            }
48        }
49    }
50
51    "Linux".to_string()
52}
53
54/// Get uptime as formatted string
55pub fn get_uptime() -> String {
56    let uptime_secs = System::uptime();
57    let hours = uptime_secs / 3600;
58    let minutes = (uptime_secs % 3600) / 60;
59
60    if hours > 0 {
61        format!("{hours}h {minutes}m")
62    } else {
63        format!("{minutes}m")
64    }
65}
66
67/// Get uptime in seconds
68pub fn get_uptime_seconds() -> u64 {
69    System::uptime()
70}