1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use nix::sys::utsname; pub const APPLE: [&str; 4] = ["macos", "darwin", "mac", "dmg"]; pub const LINUX: [&str; 1] = ["linux"]; pub const AMD64: [&str; 4] = ["x64", "x86_64", "amd64", "64bit"]; pub const ARM64: [&str; 2] = ["aarch64", "arm64"]; #[derive(Debug, Default)] pub struct SystemInfo { pub arch: String, pub os: String, } #[derive(Debug)] pub enum PlatformOS { Windows, Linux, Darwin, Unknown, } #[derive(Debug)] pub enum PlatformArch { X8664, Arm64, Unknown, } impl SystemInfo { pub fn new() -> Self { let uts_name = utsname::uname(); Self { os: uts_name.sysname().to_lowercase(), arch: uts_name.machine().to_lowercase(), } } pub fn platform_os(&self) -> PlatformOS { for apple in APPLE.iter() { if self.os.contains(apple) { return PlatformOS::Darwin; } } for linux in LINUX.iter() { if self.os.contains(linux) { return PlatformOS::Linux; } } PlatformOS::Unknown } pub fn platform_arch(&self) -> PlatformArch { for amd64 in AMD64.iter() { if self.arch.contains(amd64) { return PlatformArch::X8664; } } for arm64 in ARM64.iter() { if self.arch.contains(arm64) { return PlatformArch::Arm64; } } PlatformArch::Unknown } }