connpass_rs/query/
mod.rs

1//! Provides the utility data for query parameters.
2//! The core data type is `Query`, but it's recommended that build it through `QueryBuilder`.
3
4use self::types::OrderOption;
5
6pub mod builder;
7pub mod types;
8pub mod validator;
9
10/// A query data to extract the specific data from connpass API.
11/// For more details about the respective fields: https://connpass.com/about/api/
12/// The struct is along with the specification.
13#[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}