use std::marker::PhantomData;
use elastic_reqwest::ElasticClient;
use error::*;
use client::{Client, RequestParams, IntoResponse};
use client::responses::ResponseBuilder;
pub use elastic_reqwest::IntoReqwestBody as IntoBody;
pub use elastic_reqwest::req::{HttpRequest, HttpMethod, empty_body, Url, DefaultBody};
pub use elastic_reqwest::req::params;
pub use elastic_reqwest::req::endpoints;
pub use self::params::*;
pub use self::endpoints::*;
mod search;
pub use self::search::*;
mod get_document;
pub use self::get_document::*;
mod index_document;
pub use self::index_document::*;
mod put_mapping;
pub use self::put_mapping::*;
mod create_index;
pub use self::create_index::*;
pub struct RequestBuilder<'a, TRequest, TBody> {
client: &'a Client,
params: Option<RequestParams>,
req: TRequest,
_marker: PhantomData<TBody>,
}
impl Client {
pub fn request<'a, TRequest, TBody>(&'a self,
req: TRequest)
-> RequestBuilder<'a, TRequest, TBody>
where TRequest: Into<HttpRequest<'static, TBody>>,
TBody: IntoBody
{
RequestBuilder::new(&self, None, req)
}
}
impl<'a, TRequest, TBody> RequestBuilder<'a, TRequest, TBody> {
fn new(client: &'a Client, params: Option<RequestParams>, req: TRequest) -> Self {
RequestBuilder {
client: client,
params: params,
req: req,
_marker: PhantomData,
}
}
}
impl<'a, TRequest, TBody> RequestBuilder<'a, TRequest, TBody> {
pub fn params<F>(mut self, builder: F) -> Self
where F: Fn(RequestParams) -> RequestParams
{
self.params = Some(builder(self.params.unwrap_or(self.client.params.clone())));
self
}
}
impl<'a, TRequest, TBody> RequestBuilder<'a, TRequest, TBody>
where TRequest: Into<HttpRequest<'static, TBody>>,
TBody: IntoBody
{
fn send_raw(self) -> Result<ResponseBuilder> {
let params = self.params.as_ref().unwrap_or(&self.client.params);
let res = self.client.http.elastic_req(params, self.req)?;
Ok(IntoResponse(res).into())
}
}
impl<'a, TRequest, TBody> RequestBuilder<'a, TRequest, TBody>
where TRequest: Into<HttpRequest<'static, TBody>>,
TBody: IntoBody
{
pub fn send(self) -> Result<ResponseBuilder> {
self.send_raw()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn request_builder_params() {
let client = Client::new(RequestParams::new("http://eshost:9200")).unwrap();
let req = RequestBuilder::<_, ()>::new(&client, None, PingRequest::new())
.params(|p| p.url_param("pretty", true))
.params(|p| p.url_param("refresh", true));
let params = &req.params.unwrap();
let (_, query) = params.get_url_qry();
assert_eq!("http://eshost:9200", ¶ms.base_url);
assert_eq!("?pretty=true&refresh=true", query.unwrap());
}
}