openauth-telemetry 0.0.4

Telemetry support for OpenAuth.
Documentation
use std::future::Future;
use std::pin::Pin;

use crate::types::{TelemetryHttpError, TelemetryHttpTransport};

#[cfg(not(feature = "http"))]
pub struct NoopTransport;

#[cfg(not(feature = "http"))]
impl TelemetryHttpTransport for NoopTransport {
    fn post_json<'a>(
        &'a self,
        _url: &'a str,
        _body: &'a serde_json::Value,
    ) -> Pin<Box<dyn Future<Output = Result<(), TelemetryHttpError>> + Send + 'a>> {
        Box::pin(async move { Ok(()) })
    }
}

#[cfg(feature = "http")]
pub struct ReqwestTelemetryTransport {
    client: reqwest::Client,
}

#[cfg(feature = "http")]
impl Default for ReqwestTelemetryTransport {
    fn default() -> Self {
        Self {
            client: reqwest::Client::new(),
        }
    }
}

#[cfg(feature = "http")]
impl TelemetryHttpTransport for ReqwestTelemetryTransport {
    fn post_json<'a>(
        &'a self,
        url: &'a str,
        body: &'a serde_json::Value,
    ) -> Pin<Box<dyn Future<Output = Result<(), TelemetryHttpError>> + Send + 'a>> {
        Box::pin(async move {
            let response = self
                .client
                .post(url)
                .json(body)
                .send()
                .await
                .map_err(|e| TelemetryHttpError(e.to_string()))?;
            if response.status().is_success() {
                Ok(())
            } else {
                Err(TelemetryHttpError(format!(
                    "http status {}",
                    response.status()
                )))
            }
        })
    }
}