use std::{convert::TryInto, fmt};
use crate::{
client::{blocking, Client},
Credentials, Error, Result,
};
pub struct ClientBuilder {
user_agent: String,
credentials: Option<Credentials>,
}
impl ClientBuilder {
pub fn with_user_agent(user_agent: impl fmt::Display) -> Self {
Self {
user_agent: user_agent.to_string(),
credentials: None,
}
}
pub fn with_credentials(
mut self,
credentials: impl Into<Credentials>,
) -> Self {
self.credentials = Some(credentials.into());
self
}
pub fn build_blocking(self) -> Result<blocking::Client> {
Ok(blocking::Client {
client: reqwest::blocking::Client::default(),
credentials: self.credentials,
user_agent: self
.user_agent
.try_into()
.map_err(Error::invalid_agent)?,
})
}
pub fn build_async(self) -> Result<Client> {
Ok(Client {
client: reqwest::Client::default(),
credentials: self.credentials,
user_agent: self
.user_agent
.try_into()
.map_err(Error::invalid_agent)?,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{auth::tests::DummyCredentials, client};
use anyhow::Result;
#[test]
fn client_builder_with_credentials() -> Result<()> {
let dummy = DummyCredentials::new()?;
let credentials = Credentials::read(&dummy.path)?;
let client = ClientBuilder::with_user_agent(client::user_agent())
.with_credentials(credentials)
.build_blocking()?;
assert_eq!(client.user_agent.to_str()?, client::user_agent());
assert!(client.credentials.is_some());
Ok(())
}
}