use reqwest::header::{self, HeaderMap, HeaderName, HeaderValue, IntoHeaderName};
#[derive(Debug, Clone)]
pub struct HeaderMapBuilder {
map: HeaderMap,
}
impl HeaderMapBuilder {
pub fn new() -> Self {
Self {
map: HeaderMap::new(),
}
}
pub fn build(self) -> HeaderMap {
self.map
}
pub fn field<K: IntoHeaderName, V: Into<HeaderBuilderValue>>(mut self, key: K, val: V) -> Self {
self.map.insert(key, val.into().into());
self
}
pub fn with_user_agent(self) -> Self {
self.field(
header::USER_AGENT,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
)
}
pub fn set_user_agent<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::USER_AGENT, user_agent_value)
}
pub fn accept<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::ACCEPT, user_agent_value)
}
pub fn accept_language<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::ACCEPT_LANGUAGE, user_agent_value)
}
pub fn te<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::TE, user_agent_value)
}
pub fn authorization<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::AUTHORIZATION, user_agent_value)
}
pub fn content_type<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::CONTENT_TYPE, user_agent_value)
}
pub fn content_length<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::CONTENT_LENGTH, user_agent_value)
}
pub fn referer<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::REFERER, user_agent_value)
}
pub fn origin<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::ORIGIN, user_agent_value)
}
pub fn host<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::HOST, user_agent_value)
}
pub fn accept_encoding<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::ACCEPT_ENCODING, user_agent_value)
}
pub fn connection<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::CONNECTION, user_agent_value)
}
pub fn cache_control<V: Into<HeaderBuilderValue>>(self, value: V) -> Self {
self.field(header::CACHE_CONTROL, value)
}
pub fn pragma<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::PRAGMA, user_agent_value)
}
pub fn content_disposition<V: Into<HeaderBuilderValue>>(self, user_agent_value: V) -> Self {
self.field(header::CONTENT_DISPOSITION, user_agent_value)
}
}
#[derive(Debug, Clone)]
pub enum HeaderBuilderValue {
Static(&'static str),
Value(HeaderValue),
Name(HeaderName),
}
impl Into<HeaderValue> for HeaderBuilderValue {
fn into(self) -> HeaderValue {
match self {
HeaderBuilderValue::Static(s) => HeaderValue::from_static(s),
HeaderBuilderValue::Value(v) => v,
HeaderBuilderValue::Name(name) => HeaderValue::from_name(name),
}
}
}
impl From<&'static str> for HeaderBuilderValue {
fn from(value: &'static str) -> Self {
HeaderBuilderValue::Static(value)
}
}
impl From<HeaderValue> for HeaderBuilderValue {
fn from(value: HeaderValue) -> Self {
HeaderBuilderValue::Value(value)
}
}
impl From<HeaderName> for HeaderBuilderValue {
fn from(value: HeaderName) -> Self {
HeaderBuilderValue::Name(value)
}
}