tmdb_api/client/
reqwest.rs

1#[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(&params)
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}