use anyhow::{ensure, Result};
use embedded_svc::{http::client::Client as HttpClient, io::Write};
use esp_idf_svc::http::client::{Configuration, EspHttpConnection};
use crate::wifi::Connection;
pub struct Client<'a> {
client: HttpClient<EspHttpConnection>,
wifi: Connection<'a>,
}
impl<'a> Client<'a> {
pub fn new(wifi: Connection<'a>) -> Result<Self> {
let client =
HttpClient::wrap(EspHttpConnection::new(&Configuration::default())?);
Ok(Self { client, wifi })
}
pub fn post(&mut self, url: &str, payload: Option<&[u8]>) -> Result<u16> {
ensure!(self.wifi.is_on()?, "WIFI is off");
let payload = payload.unwrap_or(b"");
let content_length_header = format!("{}", payload.len());
let headers = [
("content-type", "text/plain"),
("content-length", &*content_length_header),
];
let mut request = self.client.post(url, &headers)?;
request.write_all(payload)?;
request.flush()?;
let response = request.submit()?;
let status = response.status();
ensure!(
(200..300).contains(&status),
"Request failed with status: {}",
status
);
Ok(status)
}
}