use body::Body;
use client::Client;
use error::{Error, ResultExt};
use request::{Request, RequestHeader};
use reqwest::header::{HeaderMap, HeaderValue, IntoHeaderName};
use reqwest::{IntoUrl, Method, Url};
use response::Response;
pub struct RequestBuilder<'cl, Cl: Client + 'cl> {
client: &'cl Cl,
url: Result<Url, Error>,
method: Method,
headers: HeaderMap,
body: Option<Body>,
}
impl<'cl, Cl: Client + 'cl> RequestBuilder<'cl, Cl> {
#[doc(hidden)]
pub fn new<U: IntoUrl>(client: &'cl Cl, url: U, method: Method) -> Self {
RequestBuilder {
client: client,
url: url.into_url().chain_err(|| "invalid url"),
method: method,
headers: HeaderMap::new(),
body: None,
}
}
pub fn header<H: IntoHeaderName>(mut self, name: H, value: HeaderValue) -> Self {
self.headers.insert(name, value);
self
}
pub fn headers(mut self, headers: HeaderMap) -> Self {
self.headers.extend(headers);
self
}
pub fn body<B: Into<Body>>(mut self, body: B) -> Self {
self.body = Some(body.into());
self
}
pub fn send(self) -> Result<Response, Error> {
let request = Request {
header: RequestHeader {
url: self.url?,
method: self.method,
headers: self.headers,
},
body: self.body,
};
self.client.execute(None, request)
}
}