wapm_resolve_url/
lib.rs

1use url::Url;
2use graphql_client::GraphQLQuery;
3
4mod graphql;
5#[cfg(not(target_arch = "wasm32"))]
6mod proxy;
7
8#[derive(GraphQLQuery)]
9#[graphql(
10    schema_path = "graphql/schema.graphql",
11    query_path = "graphql/query-url-of-file-targz.graphql",
12    response_derives = "Debug"
13)]
14pub struct GetPackageQueryTarGz;
15
16#[derive(GraphQLQuery)]
17#[graphql(
18    schema_path = "graphql/schema.graphql",
19    query_path = "graphql/query-url-of-file-pirita.graphql",
20    response_derives = "Debug"
21)]
22pub struct GetPackageQueryPirita;
23
24pub fn whoami_distro() -> String {
25    whoami::distro().to_lowercase()
26}
27
28pub fn get_current_wapm_registry() -> Option<Url> {
29    let command = std::process::Command::new("wapm")
30    .arg("config")
31    .arg("get")
32    .arg("registry.url")
33    .output()
34    .ok()?;
35    Some(Url::parse(std::str::from_utf8(&command.stdout).ok()?).ok()?)
36}
37
38#[derive(Debug, PartialEq, Clone)]
39pub struct PackageRegistryInfoTarGz {
40    pub registry: Url,
41    /// Name of the package as originally queried
42    pub queried_name: String,
43    /// Version of the originally queried package 
44    pub queried_version: Option<String>, 
45    /// Name of the resolved package, this can differ from the original package name
46    /// due to server-side package redirection
47    pub resolved_name: String,
48    /// Resolved version of the package
49    pub resolved_version: String,
50    /// URL of the .tar.gz file
51    pub url: Url,
52}
53
54pub fn get_tar_gz_url_of_package(registry: &Url, package_id: &str, version: Option<&str>) -> Option<PackageRegistryInfoTarGz> {
55
56    let q = GetPackageQueryTarGz::build_query(get_package_query_tar_gz::Variables {
57        name: package_id.to_string(),
58    });
59    let all_package_versions: get_package_query_tar_gz::ResponseData = crate::graphql::execute_query(registry, &q).ok()?;
60
61    match version {
62        Some(specific) => {
63            let last_package = all_package_versions.package.as_ref()?.versions.as_ref()?;
64            
65            let last_package = last_package
66            .iter()
67            .filter_map(|v| v.as_ref())
68            .filter(|v| v.version == specific)
69            .next()?;
70
71            let url = Url::parse(&last_package.distribution.download_url).ok()?;
72            Some(PackageRegistryInfoTarGz {
73                registry: registry.clone(),
74                queried_name: package_id.to_string(),
75                queried_version: version.as_ref().map(|s| s.to_string()),
76                resolved_name: all_package_versions.package.as_ref()?.name.to_string(),
77                resolved_version: last_package.version.to_string(),
78                url: url,
79            })
80        },
81        None => {
82            let last_version = all_package_versions.package.as_ref()?.last_version.as_ref()?;
83            let url = Url::parse(&last_version.distribution.download_url).ok()?;
84            Some(PackageRegistryInfoTarGz {
85                registry: registry.clone(),
86                queried_name: package_id.to_string(),
87                queried_version: version.as_ref().map(|s| s.to_string()),
88                resolved_name: all_package_versions.package.as_ref()?.name.to_string(),
89                resolved_version: last_version.version.to_string(),
90                url: url,
91            })
92        },
93    }
94}
95
96#[derive(Debug, PartialEq, Clone)]
97pub struct PackageRegistryInfoPirita {
98    pub registry: Url,
99    /// Name of the package as originally queried
100    pub queried_name: String,
101    /// Version of the originally queried package 
102    pub queried_version: Option<String>, 
103    /// Name of the resolved package, this can differ from the original package name
104    /// due to server-side package redirection
105    pub resolved_name: String,
106    /// Resolved version of the package
107    pub resolved_version: String,
108    /// URL of the .tar.gz file
109    pub url: Url,
110}
111pub fn get_pirita_url_of_package(registry: &Url, package_id: &str, version: Option<&str>) -> Option<PackageRegistryInfoPirita> {
112    
113    let q = GetPackageQueryPirita::build_query(get_package_query_pirita::Variables {
114        name: package_id.to_string(),
115    });
116    let all_package_versions: get_package_query_pirita::ResponseData = crate::graphql::execute_query(registry, &q).ok()?;
117
118    match version {
119        Some(specific) => {
120            let last_package = all_package_versions.package.as_ref()?.versions.as_ref()?;
121            let last_package = last_package
122            .iter()
123            .filter_map(|v| v.as_ref())
124            .filter(|v| v.version == specific)
125            .next()?;
126
127            let url = Url::parse(&last_package.distribution.pirita_download_url.as_ref().map(|s| s.as_str())?).ok()?;
128            Some(PackageRegistryInfoPirita {
129                registry: registry.clone(),
130                queried_name: package_id.to_string(),
131                queried_version: version.as_ref().map(|s| s.to_string()),
132                resolved_name: all_package_versions.package.as_ref()?.name.to_string(),
133                resolved_version: last_package.version.to_string(),
134                url: url,
135            })
136        },
137        None =>{
138            let last_version = all_package_versions.package.as_ref()?.last_version.as_ref()?;
139            let url = Url::parse(&last_version.distribution.pirita_download_url.as_ref().map(|s| s.as_str())?).ok()?;
140            Some(PackageRegistryInfoPirita {
141                registry: registry.clone(),
142                queried_name: package_id.to_string(),
143                queried_version: version.as_ref().map(|s| s.to_string()),
144                resolved_name: all_package_versions.package.as_ref()?.name.to_string(),
145                resolved_version: last_version.version.to_string(),
146                url: url,
147            })
148        },
149    }
150}