igdb_api_rust/
apicalypse_builder.rs1#[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
11impl ApicalypseBuilder {
13
14 pub fn filter(mut self, filter: &str) -> Self {
16 self.filter = filter.to_string();
17 self
18 }
19
20 pub fn limit(mut self, limit: usize) -> Self {
22 self.limit = limit;
23 self
24 }
25
26 pub fn offset(mut self, offset: usize) -> Self {
28 self.offset = offset;
29 self
30 }
31
32 pub fn fields(mut self, fields: &str) -> Self {
34 self.fields = fields.to_string();
35 self
36 }
37
38 pub fn exclude(mut self, exclude: &str) -> Self {
40 self.exclude = exclude.to_string();
41 self
42 }
43
44 pub fn sort(mut self, sort: &str) -> Self {
46 self.sort = sort.to_string();
47 self
48 }
49
50 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}