use crate::{
core::{WeatherReading, Writer},
influxdb::line_protocol::LineProtocol,
};
use reqwest::Client;
pub struct InfluxWriter {
url: String,
org: String,
bucket: String,
token: String,
client: Client,
}
impl InfluxWriter {
pub fn new(url: String, org: String, bucket: String, token: String) -> Self {
Self {
url,
org,
bucket,
token,
client: Client::new(),
}
}
}
impl Writer for InfluxWriter {
async fn write(&mut self, weather_reading: &WeatherReading) -> Result<(), ()> {
let query = weather_reading.to_line_protocol();
println!("{}", &query);
let url = format!("{}/api/v2/write", self.url);
let request = self
.client
.post(url)
.query(&[
("org", &self.org),
("bucket", &self.bucket),
("precision", &String::from("ms")),
])
.header("Authorization", format!("Token {}", self.token))
.body(query);
if let Ok(response) = request.send().await {
if response.status() == 204 {
Ok(())
} else {
Err(())
}
} else {
Err(())
}
}
}