1use serde::Serialize;
4use reqwest::{ Client as ReqwestClient, RequestBuilder };
5use crate::{
6 requests::{ Request, RequestBody },
7 error::Result,
8 multipart::to_form,
9};
10
11static BASE_URL: &str = "http://protein.bio.unipd.it/ringws";
13
14#[derive(Debug, Clone)]
16pub struct Client {
17 client: ReqwestClient,
19}
20
21impl Client {
22 pub fn new() -> Self {
24 Client {
25 client: ReqwestClient::new()
26 }
27 }
28
29 pub fn send<R: Request>(&self, request: R) -> Result<R::Response> {
31 let endpoint = request.endpoint();
32 let endpoint = endpoint.trim_matches('/');
33 let url = format!("{}/{}", BASE_URL, endpoint);
34
35 self.client
36 .request(R::METHOD, &url)
37 .headers(request.headers())
38 .ring_body(request.body())?
39 .send()
40 .and_then(|mut resp| resp.json())
41 .map_err(From::from)
42 }
43}
44
45impl Default for Client {
46 fn default() -> Self {
47 Self::new()
48 }
49}
50
51trait RequestBuilderExt: Sized {
54 fn ring_body<T: Serialize>(self, body: RequestBody<T>) -> Result<Self>;
56}
57
58impl RequestBuilderExt for RequestBuilder {
59 fn ring_body<T: Serialize>(self, body: RequestBody<T>) -> Result<Self> {
60 Ok(match body {
61 RequestBody::None => self,
62 RequestBody::Json(value) => self.json(&value),
63 RequestBody::Query(value) => self.query(&value),
64 RequestBody::Form(value) => self.form(&value),
65 RequestBody::Multipart(value) => self.multipart(to_form(&value)?),
66 })
67 }
68}