harbor_rs 0.1.2

Harbor API in Rust
Documentation
use std::str::FromStr;
use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
use anyhow::{anyhow, Result};
use reqwest::{IntoUrl, Method};

#[derive(Debug)]
pub struct Client {
    base_url: String,
    pub client: reqwest::Client,
}

impl Client {
    pub fn new(base_url: String, username: String, password: String) -> Result<Client> {
        let token = base64::encode(format!("{}:{}", username, password));
        let client = Client {
            base_url,
            client: reqwest::Client::builder()
                .timeout(core::time::Duration::from_secs(60))
                .default_headers(
                    HeaderMap::from_iter(vec![
                        (HeaderName::from_str("Authorization")?,
                         HeaderValue::from_str(format!("Basic {}", token).as_str())?),
                    ]),
                )
                .build()?,
        };
        Ok(client)
    }

    pub fn setup() -> Result<Client> {
        let base_url: &'static str = option_env!("HARBOR_BASE_URL").ok_or(anyhow!("HARBOR_BASE_URL not set"))?;
        let username: &'static str = option_env!("HARBOR_USERNAME").ok_or(anyhow!("HARBOR_USERNAME not set"))?;
        let password: &'static str = option_env!("HARBOR_PASSWORD").ok_or(anyhow!("HARBOR_PASSWORD not set"))?;
        Ok(self::Client::new(
            base_url.to_string(),
            username.to_string(),
            password.to_string())?)
    }

    pub fn build_request<U: IntoUrl>(&self, method: Method, path: U) -> reqwest::RequestBuilder {
        let url = self.build_url(path);
        self.client.request(method, url)
    }

    fn build_url<U: IntoUrl>(&self, path: U) -> String {
        format!("{}{}", self.base_url, path.as_str())
    }
}