exceptionless 0.1.0

Rust client for Exceptionless tracking errors, log messages, and feature usage events
Documentation
use std::error::Error as StdError;

use crate::{
    builder::EventBuilder,
    config::ClientConfig,
    error::{ClientError, ErrorEventBuilder},
    event::Event,
    feature::FeatureUsageBuilder,
    log::LogEventBuilder,
    transport::{SubmissionRequest, SubmissionResult, Transport, http::HttpTransport},
};

#[derive(Debug, Clone)]
pub struct ExceptionlessClient<T: Transport = HttpTransport> {
    config: ClientConfig,
    transport: T,
}

impl ExceptionlessClient<HttpTransport> {
    pub fn with_api_key(api_key: impl Into<String>) -> Self {
        Self::new(ClientConfig::new(api_key), HttpTransport::default())
    }
}

impl<T: Transport> ExceptionlessClient<T> {
    pub fn new(config: ClientConfig, transport: T) -> Self {
        Self { config, transport }
    }

    pub fn config(&self) -> &ClientConfig {
        &self.config
    }

    pub fn transport(&self) -> &T {
        &self.transport
    }

    pub fn error<'a, E>(&'a self, error: &'a E) -> ErrorEventBuilder<'a, T>
    where
        E: StdError + 'static + ?Sized,
    {
        ErrorEventBuilder::new(self, error)
    }

    pub fn log<'a>(&'a self, message: impl Into<String>) -> LogEventBuilder<'a, T> {
        LogEventBuilder::new(EventBuilder::new(self, Event::log(message)))
    }

    pub fn feature<'a>(&'a self, feature_name: impl Into<String>) -> FeatureUsageBuilder<'a, T> {
        FeatureUsageBuilder::new(EventBuilder::new(self, Event::feature_usage(feature_name)))
    }

    pub async fn submit(&self, event: Event) -> Result<SubmissionResult, ClientError> {
        self.submit_batch([event]).await
    }

    pub async fn submit_batch<I>(&self, events: I) -> Result<SubmissionResult, ClientError>
    where
        I: IntoIterator<Item = Event>,
    {
        let events: Vec<_> = events.into_iter().map(Event::into_wire).collect();
        if events.is_empty() {
            return Err(ClientError::EmptyBatch);
        }

        let request = SubmissionRequest::from_events(&self.config, &events)?;
        self.transport
            .submit_events(request)
            .await
            .map_err(ClientError::from)
    }
}