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 pub queried_name: String,
43 pub queried_version: Option<String>,
45 pub resolved_name: String,
48 pub resolved_version: String,
50 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 pub queried_name: String,
101 pub queried_version: Option<String>,
103 pub resolved_name: String,
106 pub resolved_version: String,
108 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}