asoiaf_api/requester/
request.rs1use super::{
2 filter::{BookFilter, CharacterFilter, HouseFilter},
3 pagination::Pagination,
4 ToRequest, ToUrl,
5};
6
7#[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}