vsix 1.0.2

A command-line utility that downloads and installs .vsix extensions into Visual Studio Code and Cursor
Documentation
use std::fmt;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Architecture {
    Win32X64,
    Win32Arm64,
    DarwinX64,
    DarwinArm64,
    LinuxX64,
    LinuxArm64,
    LinuxArmhf,
    AlpineX64,
    AlpineArm64,
    Universal,
}

impl Architecture {
    #[must_use]
    pub fn detect() -> Self {
        let os = std::env::consts::OS;
        let arch = std::env::consts::ARCH;

        match (os, arch) {
            ("windows", "x86_64") => Architecture::Win32X64,
            ("windows", "aarch64") => Architecture::Win32Arm64,
            ("macos", "x86_64") => Architecture::DarwinX64,
            ("macos", "aarch64") => Architecture::DarwinArm64,
            ("linux", "x86_64") => Architecture::LinuxX64,
            ("linux", "aarch64") => Architecture::LinuxArm64,
            ("linux", "arm") => Architecture::LinuxArmhf,
            _ => Architecture::Universal,
        }
    }

    #[must_use]
    pub fn to_platform_string(&self) -> Option<&str> {
        match self {
            Architecture::Win32X64 => Some("win32-x64"),
            Architecture::Win32Arm64 => Some("win32-arm64"),
            Architecture::DarwinX64 => Some("darwin-x64"),
            Architecture::DarwinArm64 => Some("darwin-arm64"),
            Architecture::LinuxX64 => Some("linux-x64"),
            Architecture::LinuxArm64 => Some("linux-arm64"),
            Architecture::LinuxArmhf => Some("linux-armhf"),
            Architecture::AlpineX64 => Some("alpine-x64"),
            Architecture::AlpineArm64 => Some("alpine-arm64"),
            Architecture::Universal => None,
        }
    }
}

impl fmt::Display for Architecture {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.to_platform_string().unwrap_or("universal"))
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_architecture_to_platform_string() {
        assert_eq!(
            Architecture::Win32X64.to_platform_string(),
            Some("win32-x64")
        );
        assert_eq!(
            Architecture::DarwinArm64.to_platform_string(),
            Some("darwin-arm64")
        );
        assert_eq!(
            Architecture::LinuxX64.to_platform_string(),
            Some("linux-x64")
        );
        assert_eq!(Architecture::Universal.to_platform_string(), None);
    }

    #[test]
    fn test_architecture_display() {
        assert_eq!(Architecture::Win32X64.to_string(), "win32-x64");
        assert_eq!(Architecture::Universal.to_string(), "universal");
    }
}