use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
const ADDITIONAL_HEADERS_VAR: &'static str = "RUST_AI_ADDITIONAL_HEADERS";
type RawHeader<'a> = (&'a str, &'a str);
type Header = (String, String);
#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct AdditionalHeaders {
headers: Vec<Header>,
}
impl Default for AdditionalHeaders {
fn default() -> Self {
Self { headers: vec![] }
}
}
impl AdditionalHeaders {
pub fn from_var() -> Self {
if let Ok(c) = std::env::var(ADDITIONAL_HEADERS_VAR) {
if let Ok(deserialized) = serde_json::from_str::<Self>(&c) {
return deserialized;
}
}
Default::default()
}
}
impl AdditionalHeaders {
pub fn set_header<'a>(&mut self, header: RawHeader<'a>) {
let header_name = header.0.to_string();
let header_value = header.1.to_string();
if header_name.contains("\0") || header_value.contains("\0") {
panic!("`\0` cannot present in any field of the header");
}
self.headers.push((header_name, header_value));
}
pub fn provide(&self) -> HeaderMap {
let mut hm = HeaderMap::new();
self.headers.iter().for_each(|h| {
hm.append(
HeaderName::from_lowercase(h.0.to_lowercase().as_bytes()).unwrap(),
HeaderValue::from_str(&h.1).unwrap(),
);
});
hm
}
pub fn to_var(&self) {
let serialized = serde_json::to_string(self).unwrap();
std::env::set_var(ADDITIONAL_HEADERS_VAR, serialized);
}
}