1pub mod ops;
2pub mod err;
3pub mod model;
4pub(crate) mod util;
5
6use std::collections::HashMap;
7use reqwest::Url;
8use ops::{get_package_versions::RegistrationLeaf, service_index::ServiceIndex};
9
10pub use err::{Result, Error};
11
12pub struct NugetRegistry {
13 client: reqwest::Client,
14 registry_base_url: Url,
15 pub index: HashMap<String, Url>,
16}
17
18impl NugetRegistry {
19 pub async fn connect(index_url: Url) -> reqwest::Result<Self> {
20 let client = reqwest::Client::builder()
21 .gzip(true)
22 .build()?;
23 let index = client.get(index_url.clone()).send().await?.bytes().await?;
24 let index : ServiceIndex = serde_json::from_slice(&index).unwrap();
25
26 let mut index2 = HashMap::with_capacity(index.resources.len());
27 for resource in index.resources {
28 let url = Url::parse(&resource.id).unwrap();
29 index2.insert(resource.type_, url);
30 }
31
32 Ok(Self { client, registry_base_url: index_url, index: index2 })
33 }
34
35 pub async fn get_package_version(&self, package_name: &str) -> Result<Option<ops::package_base_address::PackageBaseAddressResponse>> {
36 ops::package_base_address::execute(self, package_name).await
37 }
38
39 pub async fn get_package_registrations<'a>(&'a self, package_name: &str) -> Result<impl futures::Stream<Item=Result<RegistrationLeaf>> + Send + Unpin + 'a> {
40 ops::get_package_versions::execute(self, package_name).await
41 }
42
43 pub(crate) fn try_resource(&self, name: &str) -> Option<&Url> {
44 self.index.get(name)
45 }
46
47 pub(crate) fn resource(&self, name: &str) -> Result<&Url> {
48 self.try_resource(name).ok_or_else(|| Error::UnsupportedOperation(name.to_string()))
49 }
50
51 pub(crate) fn resource_arr(&self, names: &[&str]) -> Result<&Url> {
52 for name in names {
53 if let Some(url) = self.try_resource(name) {
54 return Ok(url);
55 }
56 }
57 Err(Error::UnsupportedOperation(names.join(", ")))
58 }
59}
60