tmdb_api/client/
reqwest.rs1use 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(¶ms)
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}