igdb_api_rust/
apicalypse_builder.rs

1#[derive(Default, Clone)]
2pub struct ApicalypseBuilder {
3    filter: String,
4    limit: usize,
5    offset: usize,
6    fields: String,
7    exclude: String,
8    sort: String,
9}
10
11/// Builder for Apicalypse queries
12impl ApicalypseBuilder {
13
14    /// Add a filter to the query.
15    pub fn filter(mut self, filter: &str) -> Self {
16        self.filter = filter.to_string();
17        self
18    }
19
20    /// Add a limit of entries to the query.
21    pub fn limit(mut self, limit: usize) -> Self {
22        self.limit = limit;
23        self
24    }
25
26    /// Add an offset from where the entries should start in the results to the query.
27    pub fn offset(mut self, offset: usize) -> Self {
28        self.offset = offset;
29        self
30    }
31
32    /// Specify fields to be returned by the query.
33    pub fn fields(mut self, fields: &str) -> Self {
34        self.fields = fields.to_string();
35        self
36    }
37
38    /// Exclude fields from the query.
39    pub fn exclude(mut self, exclude: &str) -> Self {
40        self.exclude = exclude.to_string();
41        self
42    }
43
44    /// Order on some specific fields.
45    pub fn sort(mut self, sort: &str) -> Self {
46        self.sort = sort.to_string();
47        self
48    }
49
50    /// Build the query string.
51    pub fn to_query(&self) -> String {
52        format!(
53            "{}{}{}{}{}{}",
54            wrap_statement("f", &self.fields),
55            wrap_statement("x", &self.exclude),
56            wrap_statement("w", &self.filter),
57            wrap_statement("l", &self.limit),
58            wrap_statement("o", &self.offset),
59            wrap_statement("s", &self.sort),
60        )
61    }
62}
63
64fn wrap_statement<T: ToString>(prefix: &str, statemet: &T) -> String {
65    let statement_string = statemet.to_string();
66    if statement_string.is_empty() || statement_string == "0" {
67        String::default()
68    } else {
69        format!("{} {};", prefix, statement_string)
70    }
71}
72
73#[cfg(test)]
74mod tests {
75    use super::*;
76
77    #[test]
78    fn filter() {
79        assert_eq!(
80            "w id = 1337;",
81            ApicalypseBuilder::default().filter("id = 1337").to_query()
82        );
83    }
84
85    #[test]
86    fn limit() {
87        assert_eq!(
88            "l 1337;",
89            ApicalypseBuilder::default().limit(1337).to_query()
90        );
91    }
92
93    #[test]
94    fn offset() {
95        assert_eq!(
96            "o 1337;",
97            ApicalypseBuilder::default().offset(1337).to_query()
98        );
99    }
100
101    #[test]
102    fn fields() {
103        assert_eq!(
104            "f id,name;",
105            ApicalypseBuilder::default().fields("id,name").to_query()
106        );
107    }
108
109    #[test]
110    fn exclude() {
111        assert_eq!(
112            "x id,name;",
113            ApicalypseBuilder::default().exclude("id,name").to_query()
114        );
115    }
116
117    #[test]
118    fn sort() {
119        assert_eq!(
120            "s id desc;",
121            ApicalypseBuilder::default().sort("id desc").to_query()
122        );
123    }
124
125    #[test]
126    fn all() {
127        assert_eq!(
128            "f *;x id,name;w id = 1337;l 55;o 66;s id desc;",
129            ApicalypseBuilder::default()
130                .filter("id = 1337")
131                .limit(55)
132                .offset(66)
133                .fields("*")
134                .exclude("id,name")
135                .sort("id desc")
136                .to_query()
137        );
138    }
139}