use std::marker::PhantomData;
use client::{Client, Sender};
use client::requests::{HttpRequest, RequestBuilder};
pub type RawRequestBuilder<TSender, TRequest, TBody> = RequestBuilder<TSender, RawRequestInner<TRequest, TBody>>;
#[doc(hidden)]
pub struct RawRequestInner<TRequest, TBody> {
req: TRequest,
_marker: PhantomData<TBody>,
}
impl<TRequest, TBody> RawRequestInner<TRequest, TBody> {
pub(crate) fn new(req: TRequest) -> Self {
RawRequestInner {
req: req,
_marker: PhantomData,
}
}
}
impl<TSender> Client<TSender>
where
TSender: Sender,
{
pub fn request<TRequest, TBody>(&self, req: TRequest) -> RawRequestBuilder<TSender, TRequest, TBody>
where
TRequest: Into<HttpRequest<'static, TBody>>,
TBody: Into<TSender::Body>,
{
RequestBuilder::new(self.clone(), None, RawRequestInner::new(req))
}
}
impl<TSender, TRequest, TBody> RawRequestBuilder<TSender, TRequest, TBody>
where
TSender: Sender,
TRequest: Into<HttpRequest<'static, TBody>>,
TBody: Into<<TSender>::Body>,
{
pub fn send(self) -> TSender::Response {
let client = self.client;
let req = self.inner.req.into();
let params = self.params.as_ref().unwrap_or(&client.params);
client.sender.send(req, params)
}
}