asoiaf_api/requester/
request.rs

1use super::{
2    filter::{BookFilter, CharacterFilter, HouseFilter},
3    pagination::Pagination,
4    ToRequest, ToUrl,
5};
6
7/// Struct that is used to make book requests to the API.
8#[derive(Default)]
9pub(crate) struct BookRequest {
10    filter: Option<BookFilter>,
11    pagination: Option<Pagination>,
12}
13
14impl ToRequest for BookRequest {
15    fn to_request(&self) -> String {
16        let mut url = String::from("books");
17        let mut options = Vec::new();
18        if let Some(pagination) = &self.pagination {
19            options.push(pagination.to_url());
20        }
21        if let Some(filter) = &self.filter {
22            options.push(filter.to_url());
23        }
24
25        if !options.is_empty() {
26            url.push('?');
27            url.push_str(&options.join("&"));
28        }
29        url
30    }
31
32    fn update_pagination(&mut self, pagination: Pagination) {
33        self.pagination = Some(pagination);
34    }
35
36    fn next_page(&mut self) {
37        if let Some(pagination) = &mut self.pagination {
38            pagination.next_page();
39        }
40    }
41}
42
43impl BookRequest {
44    pub fn pagination(mut self, pagination: Pagination) -> Self {
45        self.pagination = Some(pagination);
46        self
47    }
48
49    pub fn filter(mut self, filter: BookFilter) -> Self {
50        self.filter = Some(filter);
51        self
52    }
53}
54
55#[derive(Default)]
56pub(crate) struct CharacterRequest {
57    filter: Option<CharacterFilter>,
58    pagination: Option<Pagination>,
59}
60
61impl ToRequest for CharacterRequest {
62    fn to_request(&self) -> String {
63        let mut url = String::from("characters");
64
65        let mut options = Vec::new();
66        if let Some(pagination) = &self.pagination {
67            options.push(pagination.to_url());
68        }
69        if let Some(filter) = &self.filter {
70            options.push(filter.to_url());
71        }
72
73        if !options.is_empty() {
74            url.push('?');
75            url.push_str(&options.join("&"));
76        }
77        url
78    }
79
80    fn update_pagination(&mut self, pagination: Pagination) {
81        self.pagination = Some(pagination);
82    }
83
84    fn next_page(&mut self) {
85        if let Some(pagination) = &mut self.pagination {
86            pagination.next_page();
87        }
88    }
89}
90
91impl CharacterRequest {
92    pub fn pagination(mut self, pagination: Pagination) -> Self {
93        self.pagination = Some(pagination);
94        self
95    }
96
97    pub fn filter(mut self, filter: CharacterFilter) -> Self {
98        self.filter = Some(filter);
99        self
100    }
101}
102
103#[derive(Default)]
104pub(crate) struct HouseRequest {
105    filter: Option<HouseFilter>,
106    pagination: Option<Pagination>,
107}
108
109impl ToRequest for HouseRequest {
110    fn to_request(&self) -> String {
111        let mut url = String::from("houses");
112        let mut options = Vec::new();
113        if let Some(pagination) = &self.pagination {
114            options.push(pagination.to_url());
115        }
116        if let Some(filter) = &self.filter {
117            options.push(filter.to_url());
118        }
119
120        if !options.is_empty() {
121            url.push('?');
122            url.push_str(&options.join("&"));
123        }
124        url
125    }
126
127    fn update_pagination(&mut self, pagination: Pagination) {
128        self.pagination = Some(pagination);
129    }
130
131    fn next_page(&mut self) {
132        if let Some(pagination) = &mut self.pagination {
133            pagination.next_page();
134        }
135    }
136}
137
138impl HouseRequest {
139    pub fn pagination(mut self, pagination: Pagination) -> Self {
140        self.pagination = Some(pagination);
141        self
142    }
143
144    pub fn filter(mut self, filter: HouseFilter) -> Self {
145        self.filter = Some(filter);
146        self
147    }
148}