use reqwest::Client;
use std::collections::HashMap;
#[derive(Clone)]
pub struct InfluxDBClient {
backend_url: String,
bucket: String,
req_client: Client,
}
impl InfluxDBClient {
pub fn new(backend_url: String, bucket: String) -> Self {
InfluxDBClient {
backend_url: backend_url,
bucket: bucket,
req_client: Client::new(),
}
}
pub async fn init(&self) -> bool {
let response = self
.req_client
.post(self.backend_url.clone() + "/query")
.body("q=CREATE DATABASE ".to_string() + &self.bucket)
.send()
.await;
response.is_ok()
}
pub async fn send(
&self,
name: String,
timestamp_ns: usize,
data: HashMap<String, serde_json::Value>,
metadata: HashMap<String, serde_json::Value>,
) -> bool {
let mut formatted_metadata = String::from("");
metadata.iter().for_each(|(k, v)| {
let value_as_string: String = match v.is_string() {
true => v.as_str().unwrap().to_string(),
false => v.to_string(),
};
formatted_metadata = formatted_metadata.clone() + ","
+ k
+ "="
+ &value_as_string
});
let mut formatted_data = String::from("");
data.iter().for_each(|(k, v)| {
let value_as_string: String = match v.is_string() {
true => v.as_str().unwrap().to_string(),
false => v.to_string(),
};
formatted_data = formatted_data.clone()
+ (if formatted_data.is_empty() {" "} else {","})
+ k
+ "="
+ &value_as_string
});
let response = self
.req_client
.post(self.backend_url.clone() + "/write?db=" + &self.bucket)
.body(
name
+ &formatted_metadata
+ " "
+ &formatted_data
+ " "
+ ×tamp_ns.to_string(),
)
.send()
.await;
response.is_ok()
}
}