1use std::rc::Rc;
2use std::sync::RwLock;
3
4use crate::{Cache, CachePolicy, Config, api};
5
6pub struct Client {
8 collections: api::collections::Client,
9 movies: api::movies::Client,
10 shows: api::shows::Client,
11 seasons: api::seasons::Client,
12 episodes: api::episodes::Client,
13
14 cache_policy: Rc<RwLock<CachePolicy>>,
15}
16
17impl Client {
18 pub fn new(config: Config, cache: Rc<dyn Cache>, cache_policy: CachePolicy) -> Self {
20 let config = Rc::new(config);
21 let cache_policy = Rc::new(RwLock::new(cache_policy));
22 Self {
23 collections: api::collections::Client::new(
24 config.clone(),
25 cache.clone(),
26 cache_policy.clone(),
27 ),
28 movies: api::movies::Client::new(config.clone(), cache.clone(), cache_policy.clone()),
29 shows: api::shows::Client::new(config.clone(), cache.clone(), cache_policy.clone()),
30 seasons: api::seasons::Client::new(config.clone(), cache.clone(), cache_policy.clone()),
31 episodes: api::episodes::Client::new(
32 config.clone(),
33 cache.clone(),
34 cache_policy.clone(),
35 ),
36
37 cache_policy,
38 }
39 }
40
41 pub fn set_cache_policy(&self, new_policy: CachePolicy) {
43 match self.cache_policy.write() {
44 Ok(mut policy) => *policy = new_policy,
45 Err(mut poison) => {
46 **poison.get_mut() = new_policy;
47 self.cache_policy.clear_poison();
48 }
49 }
50 }
51}
52
53impl Client {
54 pub fn collections(&self) -> &api::collections::Client {
56 &self.collections
57 }
58
59 pub fn movies(&self) -> &api::movies::Client {
61 &self.movies
62 }
63
64 pub fn shows(&self) -> &api::shows::Client {
66 &self.shows
67 }
68
69 pub fn seasons(&self) -> &api::seasons::Client {
71 &self.seasons
72 }
73
74 pub fn episodes(&self) -> &api::episodes::Client {
76 &self.episodes
77 }
78}