warp10 1.1.0

Warp10 client for rust
Documentation
use isahc::{
    http::status::StatusCode, AsyncBody, AsyncReadResponseExt, Body, ReadResponseExt, Request,
    RequestExt,
};

use crate::client::*;
use crate::data::*;
use crate::error::*;
use crate::response::*;
use crate::token::*;

#[derive(Debug)]
pub struct Writer<'a> {
    client: &'a Client,
    token: Token<'a>,
}

impl<'a> Writer<'a> {
    pub fn new(client: &'a Client, token: Token<'a>) -> Self {
        Self { client, token }
    }

    pub async fn post(&self, data: Vec<Data>) -> Result<Warp10Response> {
        let request = self.post_request::<AsyncBody>(data)?;
        let mut response = request.send_async().await?;
        let status = response.status();
        let payload = response.text().await?;
        self.handle_response(status, payload)
    }

    pub fn post_sync(&self, data: Vec<Data>) -> Result<Warp10Response> {
        let request = self.post_request::<Body>(data)?;
        let mut response = request.send()?;
        let status = response.status();
        let payload = response.text()?;
        self.handle_response(status, payload)
    }

    fn post_request<T: From<String>>(&self, data: Vec<Data>) -> Result<Request<T>> {
        let body = data
            .iter()
            .map(|d| d.warp10_serialize())
            .fold(String::new(), |acc, cur| {
                if acc.is_empty() {
                    cur
                } else {
                    (acc + "\n") + &cur
                }
            });

        let mut request = Request::post(self.client.update_uri()).body(T::from(body))?;
        self.token.set_headers(request.headers_mut());
        Ok(request)
    }

    fn handle_response(&self, status: StatusCode, payload: String) -> Result<Warp10Response> {
        let response = Warp10Response::new(status, payload);
        match response.status() {
            StatusCode::OK => Ok(response),
            _ => Err(Error::api_error(response)),
        }
    }
}