1use core::time::Duration;
4use std::rc::Rc;
5
6use governor::Jitter;
7
8use crate::Config;
9use crate::model::Show;
10use crate::model::id::ShowId;
11
12use super::{Error, make_request};
13
14pub struct Client {
16 config: Rc<Config>,
17}
18
19impl Client {
20 pub fn new(config: Rc<Config>) -> Self {
22 Self { config }
23 }
24}
25
26impl Client {
27 pub async fn get_details(
29 &self,
30 id: impl Into<ShowId>,
31 language: Option<&str>,
32 ) -> Result<Show, Error> {
33 self.config
34 .limiter
35 .until_ready_with_jitter(Jitter::new(
36 Duration::from_millis(0),
37 Duration::from_millis(50),
38 ))
39 .await;
40
41 Ok(self
42 .config
43 .client
44 .execute(make_request(
45 &self.config,
46 &format!("/3/tv/{}", id.into().into_raw()),
47 language,
48 )?)
49 .await?
50 .error_for_status()?
51 .json()
52 .await?)
53 }
54}