1use self::types::OrderOption;
5
6pub mod builder;
7pub mod types;
8pub mod validator;
9
10#[derive(PartialEq, Debug)]
14pub struct Query {
15 event_id: Option<Vec<u32>>,
16 keyword: Option<Vec<String>>,
17 keyword_or: Option<Vec<String>>,
18 ym: Option<Vec<u32>>,
19 ymd: Option<Vec<u32>>,
20 nickname: Option<Vec<String>>,
21 owner_nickname: Option<Vec<String>>,
22 series_id: Option<Vec<u32>>,
23 start: Option<u32>,
24 order: Option<OrderOption>,
25 count: Option<u8>,
26 format: Option<String>,
27}
28
29impl Default for Query {
30 fn default() -> Self {
31 Query {
32 event_id: None,
33 keyword: None,
34 keyword_or: None,
35 ym: None,
36 ymd: None,
37 nickname: None,
38 owner_nickname: None,
39 series_id: None,
40 start: None,
41 order: None,
42 count: None,
43 format: None,
44 }
45 }
46}
47
48impl Query {
49 pub(crate) fn make_reqwest_query(self) -> Vec<(String, String)> {
50 let mut queries = Vec::new();
51
52 assemble_query_param(&mut queries, self.event_id, "event_id");
53 assemble_query_param(&mut queries, self.keyword, "keyword");
54 assemble_query_param(&mut queries, self.keyword_or, "keyword_or");
55 assemble_query_param(&mut queries, self.ym, "ym");
56 assemble_query_param(&mut queries, self.ymd, "ymd");
57 assemble_query_param(&mut queries, self.nickname, "nickname");
58 assemble_query_param(&mut queries, self.owner_nickname, "owner_nickname");
59 assemble_query_param(&mut queries, self.series_id, "series_id");
60 assemble_single_query_param(&mut queries, self.start, "start");
61 assemble_single_query_param(&mut queries, self.order.map(|v| v.to_u8()), "order");
62 assemble_single_query_param(&mut queries, self.count, "count");
63 assemble_single_query_param(&mut queries, self.format, "format");
64
65 queries
66 }
67}
68
69fn assemble_query_param<T: ToString>(
70 queries: &mut Vec<(String, String)>,
71 source: Option<Vec<T>>,
72 query_key: &str,
73) {
74 if let Some(elems) = source {
75 for elem in elems {
76 queries.push(make_elem(query_key, elem));
77 }
78 }
79}
80
81fn assemble_single_query_param<T: ToString>(
82 queries: &mut Vec<(String, String)>,
83 source: Option<T>,
84 query_key: &str,
85) {
86 if let Some(elem) = source {
87 queries.push(make_elem(query_key, elem));
88 }
89}
90
91fn make_elem<T: ToString>(key: &str, value: T) -> (String, String) {
92 (key.to_string(), value.to_string())
93}
94
95#[cfg(test)]
96mod test {
97 use crate::query::{assemble_query_param, assemble_single_query_param, make_elem};
98
99 use super::{builder::QueryBuilder, types::OrderOption};
100
101 #[test]
102 fn test_assemble_query_param() {
103 let mut queries = vec![("event_id".to_string(), "1".to_string())];
104 assemble_query_param(&mut queries, Some(vec![2, 3]), "event_id");
105 assert_eq!(queries.len(), 3);
106
107 let mut queries = vec![("event_id".to_string(), "1".to_string())];
108 assemble_query_param::<u8>(&mut queries, None, "event_id");
109 assert_eq!(queries.len(), 1);
110 }
111
112 #[test]
113 fn test_assemble_single_query_param() {
114 let mut queries = vec![("event_id".to_string(), "1".to_string())];
115 assemble_single_query_param(&mut queries, Some(2), "event_id");
116 assert_eq!(queries.len(), 2);
117
118 let mut queries = vec![("event_id".to_string(), "1".to_string())];
119 assemble_single_query_param::<u8>(&mut queries, None, "event_id");
120 assert_eq!(queries.len(), 1);
121 }
122
123 #[test]
124 fn test_make_elem() {
125 let (key, value) = make_elem("key", 1);
126 assert_eq!(key, "key".to_string());
127 assert_eq!(value, "1".to_string());
128 }
129
130 #[test]
131 fn test_make_reqwest_query_partially() {
132 let builder = QueryBuilder::begin()
133 .event_ids(vec![1, 2, 3])
134 .keyword("Rust".to_string())
135 .start(1)
136 .order(OrderOption::Newer)
137 .count(10)
138 .format("json".to_string());
139 let query = builder.build().unwrap();
140 let reqwest_query = query.make_reqwest_query();
141 assert_eq!(
142 reqwest_query,
143 vec![
144 make_elem("event_id", 1),
145 make_elem("event_id", 2),
146 make_elem("event_id", 3),
147 make_elem("keyword", "Rust"),
148 make_elem("start", 1),
149 make_elem("order", OrderOption::Newer.to_u8()),
150 make_elem("count", 10),
151 make_elem("format", "json")
152 ]
153 );
154 }
155}