1use 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 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 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 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 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 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 let fid = machine_uid::get().unwrap_or_else(|_| "Unavailable".to_string());
69 writeln!(stdout, " ✓ {}", fid)?;
70
71 Ok(())
72}