wtx-ui 0.2.2

Different user interfaces for WTX
use crate::clap::HttpClient;
use std::{fs::OpenOptions, io::Write};
use wtx::{
  http::{
    Header, HttpClient as _, KnownHeaderName, ReqBuilder, ReqResBuffer,
    client_pool::ClientPoolBuilder,
  },
  misc::{UriRef, from_utf8_basic, str_split_once1, tracing_tree_init},
};

pub(crate) async fn http_client(http_client: HttpClient) {
  let HttpClient { data, header, method, output, uri, user_agent, verbose } = http_client;
  match verbose {
    0 => {}
    1 => tracing_tree_init(Some("info")).unwrap(),
    2 => tracing_tree_init(Some("debug")).unwrap(),
    _ => tracing_tree_init(Some("trace")).unwrap(),
  }
  let mut rrb = ReqResBuffer::empty();
  for pair in header {
    let (name, values) = str_split_once1(&pair, b':').unwrap();
    rrb
      .headers
      .push_from_iter(Header::from_name_and_value(
        name.trim(),
        values.split(',').map(|el| el.trim()),
      ))
      .unwrap();
  }
  if let Some(elem) = user_agent {
    rrb
      .headers
      .push_from_iter(Header::from_name_and_value(
        KnownHeaderName::UserAgent.into(),
        [elem.as_str()],
      ))
      .unwrap();
  }
  if let Some(elem) = data {
    rrb.body.extend_from_copyable_slice(elem.as_bytes()).unwrap();
  }
  let client = ClientPoolBuilder::tokio_rustls(1).build();
  let res = client
    .send_req_recv_res(ReqBuilder::method(method, UriRef::new(uri.as_str())), rrb)
    .await
    .unwrap();
  if let Some(elem) = output {
    OpenOptions::new()
      .create(true)
      .truncate(true)
      .write(true)
      .open(elem)
      .unwrap()
      .write_all(&res.rrd.body)
      .unwrap();
  } else {
    println!("{}", from_utf8_basic(&res.rrd.body).unwrap());
  }
}