chesterfield 0.0.1

Ergonomic, strongly-typed CouchDB client in pure Rust.
Documentation
pub(crate) mod sync {

    use crate::{Error, UrlError};
    use reqwest::Url;
    use std::sync::Arc;

    pub struct InnerClient {
        url: Url,
        http_client: Arc<reqwest::Client>,
    }

    impl InnerClient {
        pub fn new(url: impl AsRef<str>) -> Result<Self, Error> {
            let url = Url::parse(url.as_ref())?;
            let client = reqwest::ClientBuilder::new().build()?;
            let http_client = Arc::new(client);

            Ok(InnerClient { url, http_client })
        }

        pub fn join(&self, name: impl AsRef<str>) -> Result<Self, UrlError> {
            let url = self.url.join(name.as_ref())?;
            let http_client = Arc::clone(&self.http_client);

            Ok(InnerClient { url, http_client })
        }

        pub fn get(&self) -> reqwest::RequestBuilder {
            self.http_client.get(self.url.clone())
        }

        pub fn post(&self) -> reqwest::RequestBuilder {
            self.http_client.post(self.url.clone())
        }

        pub fn put(&self) -> reqwest::RequestBuilder {
            self.http_client.put(self.url.clone())
        }

        pub fn delete(&self) -> reqwest::RequestBuilder {
            self.http_client.delete(self.url.clone())
        }

        pub fn head(&self) -> reqwest::RequestBuilder {
            self.http_client.head(self.url.clone())
        }

        pub fn duplicate(&self) -> InnerClient {
            InnerClient {
                url: self.url.clone(),
                http_client: Arc::clone(&self.http_client),
            }
        }

        pub fn url(&self) -> &Url {
            &self.url
        }
    }
}

pub(crate) mod r#async {

    use crate::{Error, UrlError};
    use reqwest::Url;
    use std::sync::Arc;

    pub(crate) struct InnerClient {
        url: Url,
        http_client: Arc<reqwest::r#async::Client>,
    }

    impl InnerClient {
        pub fn new(url: impl AsRef<str>) -> Result<Self, Error> {
            let url = Url::parse(url.as_ref())?;
            let client = reqwest::r#async::ClientBuilder::new().build()?;
            let http_client = Arc::new(client);

            Ok(InnerClient { url, http_client })
        }

        pub fn join(&self, name: impl AsRef<str>) -> Result<Self, UrlError> {
            let url = self.url.join(name.as_ref())?;
            let http_client = Arc::clone(&self.http_client);

            Ok(InnerClient { url, http_client })
        }

        pub fn get(&self) -> reqwest::r#async::RequestBuilder {
            self.http_client.get(self.url.clone())
        }

        pub fn post(&self) -> reqwest::r#async::RequestBuilder {
            self.http_client.post(self.url.clone())
        }

        pub fn put(&self) -> reqwest::r#async::RequestBuilder {
            self.http_client.put(self.url.clone())
        }

        pub fn delete(&self) -> reqwest::r#async::RequestBuilder {
            self.http_client.delete(self.url.clone())
        }

        pub fn head(&self) -> reqwest::r#async::RequestBuilder {
            self.http_client.head(self.url.clone())
        }

        pub fn duplicate(&self) -> InnerClient {
            InnerClient {
                url: self.url.clone(),
                http_client: Arc::clone(&self.http_client),
            }
        }
    }
}