cipherstash-client 0.28.0

The official CipherStash SDK
Documentation
//! Module for interacting with the CipherStash Logging and Audit API.

use log::error;
use miette::Diagnostic;
use serde::Serialize;
use thiserror::Error;
use url::Url;

use crate::{
    credentials::{Credentials, GetTokenError, ServiceToken},
    reqwest_client::create_client,
    user_agent::get_user_agent,
};

#[derive(Diagnostic, Error, Debug)]
pub enum SendLogError {
    #[error(transparent)]
    Reqwest(#[from] reqwest::Error),

    #[error(transparent)]
    ReqwestMiddleware(#[from] reqwest_middleware::Error),

    #[error(transparent)]
    Credentials(#[from] GetTokenError),
}

pub struct LoggerClient<C: Credentials<Token = ServiceToken>> {
    pub log_url: Url,
    pub credentials: C,
}

impl<C: Credentials<Token = ServiceToken>> LoggerClient<C> {
    pub fn new(log_url: &Url, credentials: C) -> Self {
        Self {
            log_url: log_url.to_owned(),
            credentials,
        }
    }

    pub async fn send_logs(&self, logs_payload: impl Serialize) -> Result<(), SendLogError> {
        let client = create_client();
        let token = self.credentials.get_token().await?;

        client
            .post(self.log_url.as_ref())
            .header("authorization", token.as_header())
            .header("user-agent", get_user_agent())
            .json(&logs_payload)
            .send()
            .await?
            .error_for_status()?;

        Ok(())
    }

    ///
    /// Use empty log payload to check credentials
    ///
    pub async fn check_credentials(
        &self,
        logs_payload: impl Serialize,
    ) -> Result<(), SendLogError> {
        let client = create_client();
        let token = self.credentials.get_token().await?;

        client
            .post(self.log_url.as_ref())
            .header("authorization", token.as_header())
            .header("user-agent", get_user_agent())
            .json(&logs_payload)
            .send()
            .await?
            .error_for_status()?;

        Ok(())
    }
}