logscale_client/
client.rs

1use std::error::Error;
2
3use reqwest::{Client, StatusCode, Url};
4
5use crate::models::{
6    errors::LogScaleError, ingest::StructuredLogsIngestRequest,
7    ingest::UnstructuredLogsIngestRequest,
8};
9
10#[derive(Clone)]
11pub struct LogScaleClient {
12    logscale_url: Url,
13    ingest_token: String,
14    http_client: Client,
15    ingest_token_header_value: String,
16}
17
18impl LogScaleClient {
19    pub fn from_url(logscale_url: &str, ingest_token: String) -> Result<Self, Box<dyn Error>> {
20        let url = Url::parse(logscale_url)?;
21
22        Ok(Self {
23            logscale_url: url,
24            ingest_token: ingest_token.clone(),
25            http_client: Client::default(),
26            ingest_token_header_value: format!("Bearer {}", &ingest_token),
27        })
28    }
29
30    pub async fn ingest_structured<'a>(
31        &self,
32        request: &[StructuredLogsIngestRequest<'a>],
33    ) -> Result<(), LogScaleError> {
34        let url = self
35            .logscale_url
36            .join("api/v1/ingest/humio-structured")
37            .unwrap();
38
39        if let Ok(response) = self
40            .http_client
41            .post(url)
42            .header("Authorization", &self.ingest_token_header_value)
43            .json(&request)
44            .send()
45            .await
46        {
47            let response_status_code = response.status();
48
49            if response_status_code == StatusCode::OK {
50                Ok(())
51            } else {
52                Err(LogScaleError::ErrorWithStatusCode(
53                    response_status_code.into(),
54                ))
55            }
56        } else {
57            Err(LogScaleError::ConnectionError)
58        }
59    }
60
61    pub async fn ingest_unstructured<'a>(
62        &self,
63        request: &[UnstructuredLogsIngestRequest<'a>],
64    ) -> Result<(), LogScaleError> {
65        let url = self
66            .logscale_url
67            .join("api/v1/ingest/humio-unstructured")
68            .unwrap();
69
70        if let Ok(response) = self
71            .http_client
72            .post(url)
73            .header("Authorization", &self.ingest_token_header_value)
74            .json(&request)
75            .send()
76            .await
77        {
78            let response_status_code = response.status();
79
80            if response_status_code == StatusCode::OK {
81                Ok(())
82            } else {
83                Err(LogScaleError::ErrorWithStatusCode(
84                    response_status_code.into(),
85                ))
86            }
87        } else {
88            Err(LogScaleError::ConnectionError)
89        }
90    }
91}
92
93unsafe impl Send for LogScaleClient {}
94unsafe impl Sync for LogScaleClient {}