1use crate::{
2 error::Error,
3 item::{
4 iterator::{BookIterator, CharacterIterator, HouseIterator},
5 Book, Character, House,
6 },
7 requester::{
8 filter::{BookFilter, CharacterFilter, HouseFilter},
9 get,
10 pagination::Pagination,
11 request::{BookRequest, CharacterRequest, HouseRequest},
12 ToRequest,
13 },
14};
15
16#[derive(Default)]
21pub struct Client {}
22
23impl Client {
24 pub fn new() -> Self {
25 Self {}
26 }
27
28 pub(crate) async fn get_request<T>(&self, request: &impl ToRequest) -> Result<Vec<T>, Error>
29 where
30 T: serde::de::DeserializeOwned,
31 {
32 let answer = get(request).await?;
33
34 let answer = serde_json::from_str::<Vec<T>>(&answer)?;
35 Ok(answer)
36 }
37
38 pub async fn get_books(&self) -> Result<Vec<Book>, Error> {
39 let request = BookRequest::default();
40 self.get_request(&request).await
41 }
42
43 pub fn get_book_iterator(&self, limit: usize) -> BookIterator {
44 let request = BookRequest::default().pagination(Pagination::new(1, limit));
45 BookIterator::new(request)
46 }
47
48 pub fn get_book_filter_iterator(&self, book_filter: BookFilter, limit: usize) -> BookIterator {
49 let request = BookRequest::default()
50 .pagination(Pagination::new(1, limit))
51 .filter(book_filter);
52 BookIterator::new(request)
53 }
54
55 pub async fn get_characters(&self) -> Result<Vec<Character>, Error> {
56 let request = CharacterRequest::default().pagination(Pagination::new(1, 1000));
57 self.get_request(&request).await
58 }
59
60 pub fn get_character_iterator(&self, limit: usize) -> CharacterIterator {
61 let request = CharacterRequest::default().pagination(Pagination::new(1, limit));
62 CharacterIterator::new(request)
63 }
64
65 pub fn get_character_filter_iterator(
66 &self,
67 character_filter: CharacterFilter,
68 limit: usize,
69 ) -> CharacterIterator {
70 let request = CharacterRequest::default()
71 .pagination(Pagination::new(1, limit))
72 .filter(character_filter);
73 CharacterIterator::new(request)
74 }
75
76 pub async fn get_houses(&self) -> Result<Vec<House>, Error> {
77 let request = HouseRequest::default();
78 self.get_request(&request).await
79 }
80
81 pub fn get_house_iterator(&self, limit: usize) -> HouseIterator {
82 let request = HouseRequest::default().pagination(Pagination::new(1, limit));
83 HouseIterator::new(request)
84 }
85
86 pub fn get_house_filter_iterator(
87 &self,
88 house_filter: HouseFilter,
89 limit: usize,
90 ) -> HouseIterator {
91 let request = HouseRequest::default()
92 .pagination(Pagination::new(1, limit))
93 .filter(house_filter);
94 HouseIterator::new(request)
95 }
96}