lazy_motd/
env.rs

1/* src/env.rs */
2
3use std::io::Write;
4use sysinfo::{Disks, System};
5
6pub fn print_environment(stdout: &mut dyn Write, mode: &str) -> std::io::Result<()> {
7    let sys = System::new_all();
8
9    // --- Mode ---
10    if mode != "None" {
11        let stage = if mode.is_empty() {
12            std::env::var("STAGE").unwrap_or_else(|_| "Production".to_string())
13        } else {
14            mode.to_string()
15        };
16        writeln!(stdout, "    ✓ {}", stage)?;
17    }
18
19    // --- OS ---
20    let mut os_info =
21        System::long_os_version().unwrap_or_else(|| System::os_version().unwrap_or_default());
22    if os_info.starts_with("MacOS") {
23        os_info = os_info.replace("MacOS", "macOS");
24    }
25    let kernel_name = System::name().unwrap_or_default().to_lowercase();
26    let kernel_version = System::kernel_version().unwrap_or_default();
27    writeln!(
28        stdout,
29        "    ✓ {} {}",
30        os_info,
31        format!("{} {}", kernel_name, kernel_version)
32    )?;
33
34    // --- CPU ---
35    let cpus = sys.cpus();
36    let cpu_brand = cpus.first().map(|cpu| cpu.brand().trim()).unwrap_or("");
37    let core_count = cpus.len();
38    let arch = {
39        let a = System::cpu_arch();
40        if a.is_empty() {
41            "Unknown Arch".to_string()
42        } else {
43            a
44        }
45    };
46
47    // --- Disk ---
48    let disks = Disks::new_with_refreshed_list();
49    let fs_type = disks
50        .iter()
51        .find(|d| d.mount_point() == std::path::Path::new("/"))
52        .and_then(|d| d.file_system().to_str())
53        .unwrap_or("Unknown FS");
54
55    // --- Memory ---
56    const GIB: f64 = 1024.0 * 1024.0 * 1024.0;
57    let total_ram_gb = (sys.total_memory() as f64 / GIB).round() as u64;
58    let used_ram_percent =
59        (sys.used_memory() as f64 / sys.total_memory() as f64 * 100.0).round() as u64;
60
61    writeln!(
62        stdout,
63        "    ✓ {}({}) {} {} {}GB {}%",
64        cpu_brand, core_count, arch, fs_type, total_ram_gb, used_ram_percent
65    )?;
66
67    // --- Machine ID ---
68    let fid = machine_uid::get().unwrap_or_else(|_| "Unavailable".to_string());
69    writeln!(stdout, "    ✓ {}", fid)?;
70
71    Ok(())
72}