use reqwest::header::{HeaderMap, HeaderName, HeaderValue, ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, IF_MODIFIED_SINCE, IF_NONE_MATCH};
use url::Url;
use crate::types::Config;
pub struct RequestBuilder {
url: Url,
headers: HeaderMap,
etag: Option<String>,
last_modified: Option<String>,
}
impl RequestBuilder {
pub fn new(url: Url) -> Self {
Self {
url,
headers: HeaderMap::new(),
etag: None,
last_modified: None,
}
}
pub fn with_config(mut self, config: &Config) -> Self {
if let Ok(v) = HeaderValue::from_str(&config.fetch.accept_headers.accept) {
self.headers.insert(ACCEPT, v);
}
if let Ok(v) = HeaderValue::from_str(&config.fetch.accept_headers.accept_language) {
self.headers.insert(ACCEPT_LANGUAGE, v);
}
if let Ok(v) = HeaderValue::from_str(&config.fetch.accept_headers.accept_encoding) {
self.headers.insert(ACCEPT_ENCODING, v);
}
self
}
pub fn header(mut self, name: &str, value: &str) -> Self {
if let (Ok(n), Ok(v)) = (
HeaderName::try_from(name),
HeaderValue::from_str(value),
) {
self.headers.insert(n, v);
}
self
}
pub fn if_none_match(mut self, etag: &str) -> Self {
self.etag = Some(etag.to_string());
if let Ok(v) = HeaderValue::from_str(etag) {
self.headers.insert(IF_NONE_MATCH, v);
}
self
}
pub fn if_modified_since(mut self, date: &str) -> Self {
self.last_modified = Some(date.to_string());
if let Ok(v) = HeaderValue::from_str(date) {
self.headers.insert(IF_MODIFIED_SINCE, v);
}
self
}
pub fn url(&self) -> &Url {
&self.url
}
pub fn headers(&self) -> &HeaderMap {
&self.headers
}
pub fn build(self) -> (Url, HeaderMap) {
(self.url, self.headers)
}
}