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
    }
}