1use std::mem;
6
7use async_trait::async_trait;
8use pretend::{client::Bytes, Error, HeaderMap, Response, Result};
9use reqwest::Method;
10use url::Url;
11
12#[derive(Default)]
13pub struct Client(reqwest::Client);
14
15#[async_trait]
16impl pretend::client::Client for Client {
17 async fn execute(
18 &self,
19 method: Method,
20 url: Url,
21 headers: HeaderMap,
22 body: Option<Bytes>,
23 ) -> Result<Response<Bytes>> {
24 let mut builder = self.0.request(method, url).headers(headers);
25 if let Some(body) = body {
26 builder = builder.body(body);
27 }
28 let response = builder.send().await;
29 let mut response = response.map_err(Error::response)?;
30
31 let status = response.status();
32 let headers = mem::take(response.headers_mut());
33
34 let bytes = response.bytes().await;
35 let bytes = bytes.map_err(Error::body)?;
36
37 Ok(Response::new(status, headers, bytes))
38 }
39}