nuget_client/
lib.rs

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