use crate::error::Result;
use crate::Request;
use http::{HeaderMap, Method};
use reqwest::{Client, ClientBuilder};
use url::Url;
pub struct Grillon {
base_url: Url,
client: Client,
log_settings: LogSettings,
}
#[derive(Clone)]
pub enum LogSettings {
StdAssert,
StdOutput,
JsonOutput,
}
impl Default for LogSettings {
fn default() -> Self {
Self::StdAssert
}
}
impl Grillon {
pub fn new(base_url: &str) -> Result<Grillon> {
let client = ClientBuilder::new().cookie_store(false).build()?;
Ok(Grillon {
base_url: base_url.parse::<Url>()?,
client,
log_settings: LogSettings::default(),
})
}
pub fn log_settings(mut self, log_settings: LogSettings) -> Self {
self.log_settings = log_settings;
self
}
pub fn store_cookies(mut self, enable: bool) -> Result<Grillon> {
let client = ClientBuilder::new().cookie_store(enable).build()?;
self.client = client;
Ok(self)
}
pub fn get(&self, path: &str) -> Request<'_> {
self.http_request(Method::GET, path)
}
pub fn post(&self, path: &str) -> Request<'_> {
self.http_request(Method::POST, path)
}
pub fn put(&self, path: &str) -> Request<'_> {
self.http_request(Method::PUT, path)
}
pub fn patch(&self, path: &str) -> Request<'_> {
self.http_request(Method::PATCH, path)
}
pub fn delete(&self, path: &str) -> Request<'_> {
self.http_request(Method::DELETE, path)
}
pub fn options(&self, path: &str) -> Request<'_> {
self.http_request(Method::OPTIONS, path)
}
pub fn head(&self, path: &str) -> Request<'_> {
self.http_request(Method::HEAD, path)
}
pub fn connect(&self, path: &str) -> Request<'_> {
self.http_request(Method::CONNECT, path)
}
pub fn http_request(&self, method: Method, path: &str) -> Request<'_> {
let url = crate::url::concat(&self.base_url, path).unwrap_or_else(|err| panic!("{}", err));
Request {
method,
url,
headers: Ok(HeaderMap::new()),
payload: None,
client: &self.client,
log_settings: &self.log_settings,
basic_auth: None,
bearer_auth: None,
}
}
}