github_bin_downloader/
sysinfo.rs

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