tmdb_api/client/
reqwest.rs

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