Skip to main content

flix_tmdb/
client.rs

1use std::rc::Rc;
2use std::sync::RwLock;
3
4use crate::{Cache, CachePolicy, Config, api};
5
6/// The primary client that references all other clients
7pub 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	/// Create a new client with the given configuration
19	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	/// Modify the [CachePolicy]
42	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	/// Access the Collections API
55	pub fn collections(&self) -> &api::collections::Client {
56		&self.collections
57	}
58
59	/// Access the Movies API
60	pub fn movies(&self) -> &api::movies::Client {
61		&self.movies
62	}
63
64	/// Access the Shows API
65	pub fn shows(&self) -> &api::shows::Client {
66		&self.shows
67	}
68
69	/// Access the Seasons API
70	pub fn seasons(&self) -> &api::seasons::Client {
71		&self.seasons
72	}
73
74	/// Access the Episodes API
75	pub fn episodes(&self) -> &api::episodes::Client {
76		&self.episodes
77	}
78}