octoprint 0.1.3

(WIP) A client library for the Octoprint REST API
Documentation
use std::rc::Rc;

use super::{error::BuilderError, AuthenticationMethod, OctoClient};
use error_stack::{IntoReport, Result, ResultExt};
use reqwest::{Client, ClientBuilder, IntoUrl, Url};

pub struct OctoClientBuilder {
    builder: ClientBuilder,
    base_url: Url,
    auth_credentials: Option<Rc<AuthenticationMethod>>,
}

impl OctoClientBuilder {
    pub fn new<U: IntoUrl>(url: U) -> Result<OctoClientBuilder, reqwest::Error> {
        let url_printable = url.as_str().to_owned();

        let url = url
            .into_url()
            .into_report()
            .attach_printable_lazy(|| format!("{} is not a valid base URL", url_printable))?;

        Ok(OctoClientBuilder {
            builder: ClientBuilder::new(),
            base_url: url,
            auth_credentials: None,
        })
    }

    pub fn build(self) -> Result<OctoClient, BuilderError> {
        let err = BuilderError::Build;
        let client: Client = self.builder.build().into_report().change_context(err)?;
        let credentials = self.auth_credentials.ok_or(BuilderError::Build)?;
        Ok(OctoClient {
            client,
            base_url: self.base_url,
            auth_credentials: credentials,
        })
    }

    pub fn use_credentials(mut self, creds: Rc<AuthenticationMethod>) -> Self {
        self.auth_credentials = Some(creds);
        self
    }
}