helloworld/
01_helloworld.rs1use std::convert::TryFrom;
2use std::collections::HashSet;
3use std::iter::FromIterator;
4use std::hash::{Hash, Hasher};
5use std::cmp::{Ord, Ordering, Eq};
6
7use std::fs::remove_dir_all;
8
9use serde::{Serialize, Deserialize};
10
11use json_surf::prelude::*;
12
13
14#[derive(Serialize, Debug, Deserialize, PartialEq, PartialOrd, Clone)]
16struct UserInfo {
17 first: String,
18 last: String,
19 age: u8,
20}
21
22impl UserInfo {
23 pub fn new(first: String, last: String, age: u8) -> Self {
24 Self {
25 first,
26 last,
27 age,
28 }
29 }
30}
31
32impl Default for UserInfo {
33 fn default() -> Self {
34 let first = "".to_string();
35 let last = "".to_string();
36 let age = 0u8;
37 UserInfo::new(first, last, age)
38 }
39}
40
41
42fn main() {
43 let home = ".store".to_string();
45 let index_name = "test_user_info".to_string();
47
48 let mut builder = SurferBuilder::default();
50 builder.set_home(&home);
51
52 let data = UserInfo::default();
53 builder.add_struct(index_name.clone(), &data);
54
55 let mut surfer = Surfer::try_from(builder).unwrap();
57
58 let first = "John".to_string();
62 let last = "Doe".to_string();
63 let age = 20u8;
64 let john_doe = UserInfo::new(first, last, age);
65
66 let first = "Jane".to_string();
68 let last = "Doe".to_string();
69 let age = 18u8;
70 let jane_doe = UserInfo::new(first, last, age);
71
72 let first = "Jonny".to_string();
74 let last = "Doe".to_string();
75 let age = 10u8;
76 let jonny_doe = UserInfo::new(first, last, age);
77
78 let first = "Jinny".to_string();
80 let last = "Doe".to_string();
81 let age = 10u8;
82 let jinny_doe = UserInfo::new(first, last, age);
83
84 let _ = surfer.insert_struct(&index_name, &john_doe).unwrap();
88 let _ = surfer.insert_struct(&index_name, &jane_doe).unwrap();
89
90 let users = vec![jonny_doe.clone(), jinny_doe.clone()];
92 let _ = surfer.insert_structs(&index_name, &users).unwrap();
93
94 block_thread(1);
95
96 let expected = vec![john_doe.clone()];
100 let computed = surfer.read_all_structs::<UserInfo>(&index_name, "John").unwrap().unwrap();
101 assert_eq!(expected, computed);
102
103 let mut expected = vec![john_doe.clone(), jane_doe.clone(), jonny_doe.clone(), jinny_doe.clone()];
104 expected.sort();
105 let mut computed = surfer.read_all_structs::<UserInfo>(&index_name, "doe").unwrap().unwrap();
106 computed.sort();
107 assert_eq!(expected, computed);
108
109 let mut expected = vec![jonny_doe.clone(), jinny_doe.clone()];
111 expected.sort();
112 let mut computed = surfer.read_all_structs_by_field::<UserInfo>(&index_name, "age", "10").unwrap().unwrap();
113 computed.sort();
114 assert_eq!(expected, computed);
115
116 let before = surfer.read_all_structs::<UserInfo>(&index_name, "doe").unwrap().unwrap();
121 let before: HashSet<UserInfo> = HashSet::from_iter(before.into_iter());
122
123 surfer.delete_structs(&index_name, "john").unwrap();
125
126 let after = surfer.read_all_structs::<UserInfo>(&index_name, "doe").unwrap().unwrap();
128 let after: HashSet<UserInfo> = HashSet::from_iter(after.into_iter());
129 let computed: Vec<UserInfo> = before.difference(&after).map(|e| e.clone()).collect();
131 let expected = vec![john_doe];
133 assert_eq!(expected, computed);
134
135 let before = surfer.read_all_structs_by_field::<UserInfo>(&index_name, "age", "10").unwrap().unwrap();
138 let before: HashSet<UserInfo> = HashSet::from_iter(before.into_iter());
139
140 surfer.delete_structs_by_field(&index_name, "age", "10").unwrap();
142
143 let after = surfer.read_all_structs_by_field::<UserInfo>(&index_name, "age", "10").unwrap().unwrap();
145 let after: HashSet<UserInfo> = HashSet::from_iter(after.into_iter());
146 let mut computed: Vec<UserInfo> = before.difference(&after).map(|e| e.clone()).collect();
148 computed.sort();
149 let mut expected = vec![jonny_doe, jinny_doe];
151 expected.sort();
152 assert_eq!(expected, computed);
153
154
155 let path = surfer.which_index(&index_name).unwrap();
157 let _ = remove_dir_all(&path);
158 let _ = remove_dir_all(&home);
159}
160
161impl Ord for UserInfo {
163 fn cmp(&self, other: &Self) -> Ordering {
164 if self.first == other.first && self.last == other.last {
165 return Ordering::Equal;
166 };
167 if self.first == other.first {
168 if self.last > other.last {
169 Ordering::Greater
170 } else {
171 Ordering::Less
172 }
173 } else {
174 if self.first > other.first {
175 Ordering::Greater
176 } else {
177 Ordering::Less
178 }
179 }
180 }
181}
182
183impl Eq for UserInfo {}
185
186impl Hash for UserInfo {
188 fn hash<H: Hasher>(&self, state: &mut H) {
189 for i in self.first.as_bytes() {
190 state.write_u8(*i);
191 }
192 for i in self.last.as_bytes() {
193 state.write_u8(*i);
194 }
195 state.write_u8(self.age);
196 state.finish();
197 }
198}