vsix 1.0.2

A command-line utility that downloads and installs .vsix extensions into Visual Studio Code and Cursor
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Extension {
    pub id: String,
    pub name: String,
    pub publisher: String,
    pub version: String,
    pub display_name: String,
    pub description: Option<String>,
    pub downloads: u64,
}

impl Extension {
    #[must_use]
    pub fn unique_identifier(&self) -> String {
        format!("{}.{}", self.publisher, self.name)
    }

    #[must_use]
    pub fn download_url(&self, target_platform: Option<&str>) -> String {
        let base_url = format!(
            "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{}/vsextensions/{}/{}/vspackage",
            self.publisher, self.name, self.version
        );

        match target_platform {
            Some(platform) => format!("{base_url}?targetPlatform={platform}"),
            None => base_url,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
    pub extensions: Vec<Extension>,
    pub total_count: usize,
}

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

    #[test]
    fn test_extension_unique_identifier() {
        let ext = Extension {
            id: "test-id".to_string(),
            name: "python".to_string(),
            publisher: "ms-python".to_string(),
            version: "2024.17.2024100401".to_string(),
            display_name: "Python".to_string(),
            description: Some("Python language support".to_string()),
            downloads: 1000,
        };

        assert_eq!(ext.unique_identifier(), "ms-python.python");
    }

    #[test]
    fn test_extension_download_url_with_platform() {
        let ext = Extension {
            id: "test-id".to_string(),
            name: "python".to_string(),
            publisher: "ms-python".to_string(),
            version: "2024.17.2024100401".to_string(),
            display_name: "Python".to_string(),
            description: None,
            downloads: 1000,
        };

        let url = ext.download_url(Some("win32-x64"));
        assert_eq!(
            url,
            "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/python/2024.17.2024100401/vspackage?targetPlatform=win32-x64"
        );
    }

    #[test]
    fn test_extension_download_url_without_platform() {
        let ext = Extension {
            id: "test-id".to_string(),
            name: "python".to_string(),
            publisher: "ms-python".to_string(),
            version: "2024.17.2024100401".to_string(),
            display_name: "Python".to_string(),
            description: None,
            downloads: 1000,
        };

        let url = ext.download_url(None);
        assert_eq!(
            url,
            "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/python/2024.17.2024100401/vspackage"
        );
    }
}