tmdb_api/client/
reqwest.rs1#[derive(Debug, Default)]
2pub struct ReqwestExecutor {
3 inner: reqwest::Client,
4}
5
6impl From<reqwest::Client> for ReqwestExecutor {
7 fn from(inner: reqwest::Client) -> Self {
8 Self { inner }
9 }
10}
11
12impl From<reqwest::Error> for crate::error::Error {
13 fn from(value: reqwest::Error) -> Self {
14 crate::error::Error::Request {
15 source: Box::new(value),
16 }
17 }
18}
19
20impl super::prelude::Executor for ReqwestExecutor {
21 async fn execute<T: serde::de::DeserializeOwned, P: serde::Serialize>(
22 &self,
23 url: &str,
24 params: P,
25 ) -> crate::Result<T> {
26 let res = self
27 .inner
28 .get(url)
29 .query(¶ms)
30 .send()
31 .await
32 .map_err(|err| crate::error::Error::Request {
33 source: Box::new(err),
34 })?;
35
36 let status_code = res.status();
37 if status_code.is_success() {
38 res.json::<T>()
39 .await
40 .map_err(|err| crate::error::Error::Response {
41 source: Box::new(err),
42 })
43 } else if status_code == reqwest::StatusCode::UNPROCESSABLE_ENTITY {
44 let payload: crate::error::ServerValidationBodyError =
45 res.json()
46 .await
47 .map_err(|err| crate::error::Error::Response {
48 source: Box::new(err),
49 })?;
50 Err(crate::error::Error::Validation(payload))
51 } else {
52 let content: crate::error::ServerOtherBodyError =
53 res.json()
54 .await
55 .map_err(|err| crate::error::Error::Response {
56 source: Box::new(err),
57 })?;
58 Err(crate::error::Error::Server {
59 code: status_code.as_u16(),
60 content,
61 })
62 }
63 }
64}