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(())
}
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(())
}
}