lemon_bugsnag_rs 0.1.2

A library for interacting with the BugSnag error-reporting and sessions APIs.
Documentation
use ureq::{Error as UreqError, Request, Response};
use url::Url;

use crate::{
    common::{error::Error, traits::client_trait_sync::ClientTraitSync},
    error::payload::Payload,
};

/// Synchronous Ureq client for the BugSnag error-reporting API.
///
/// ```
/// use lemon_bugsnag_rs::common::builder::client_builder::ClientBuilder;
/// use lemon_bugsnag_rs::common::traits::decider_trait_sync::DeciderTraitSync;
/// use lemon_bugsnag_rs::common::traits::backend_builder_trait_sync::BackendBuilderTraitSync;
///
/// let mut error_builder = ClientBuilder::error();
///
/// let configured_builder = error_builder.configure(
///     "Fake API Key",
///     "Doctest configure example error class",
///     "It's not really an error, per se...",
///     "ErrorClientBuilder documentation test notifier",
///     "1.0.0",
///     "Doctest app type",
///     "Production, of course"
/// );
///
/// // Retrieve a UreqErrorSync.
/// let client = configured_builder.ureq().build().unwrap();
/// ```
#[derive(Debug)]
pub struct UreqErrorSync {
    /// The API endpiont URL.
    pub url: Url,
    ///  A synchronous Ureq client.
    pub request: Request,
    pub(crate) payload: Payload,
}

impl ClientTraitSync for UreqErrorSync {
    type Response = Response;
    type Error = Error;

    /// Sends your request to Ureq's backend
    /// ```
    /// use lemon_bugsnag_rs::common::builder::client_builder::ClientBuilder;
    /// use lemon_bugsnag_rs::common::traits::backend_builder_trait_sync::BackendBuilderTraitSync;
    /// use lemon_bugsnag_rs::common::traits::client_trait_sync::ClientTraitSync;
    /// use lemon_bugsnag_rs::error::payload::notifier::Notifier;
    ///
    /// let mut builder = ClientBuilder::error();
    /// // Use the configure() function to easily configure the client with
    /// // all necessary data.
    /// builder.configure(
    ///   "fake API key"
    ///   , "Error class for grouping errors"
    ///   , "Error message describing error"
    ///   , "Notifier name"
    ///   , "Notifier version"
    ///   , "Node, or Rails, or possibly Android, or maybe something else"
    ///   , "Production, where all the best errors happen"
    /// );
    ///
    /// // Select Ureq as the networking backend, and build the client.
    /// match builder.ureq().build() {
    ///     Ok(mut client) => {
    ///         match client.send() {
    ///             Ok(res) => {
    ///                 // Do something with the response fetched by the client
    ///             },
    ///             Err(error) => {
    ///                 // Handle errors here due to failure of client sending
    ///                 // your request
    ///                 # assert!(false, "{}", error);
    ///             }
    ///         }
    ///     },
    ///     Err(error) => {
    ///         // Handle your errors here due to failure of your client being built
    ///         # assert!(false, "{}", error.error());
    ///     },
    /// }
    /// ```
    fn send(&mut self) -> Result<Self::Response, Self::Error> {
        match self.request.clone().send_json(self.payload.clone()) {
            Ok(response) => Ok(response),
            Err(err) => match err {
                UreqError::Status(_, response) => Ok(response),
                UreqError::Transport(_) => Err(err.into()),
            },
        }
    }
}