fuzzy/
03_fuzzy_user_name.rs1use std::convert::TryFrom;
2use std::fs::remove_dir_all;
3use std::cmp::{Ord, Ordering, Eq};
4
5use serde::{Serialize, Deserialize};
6
7use json_surf::prelude::*;
8
9#[derive(Serialize, Debug, Deserialize, PartialEq, PartialOrd, Clone)]
10struct User {
11 first: String,
12 last: String,
13}
14
15impl User {
16 pub fn new(first: String, last: String) -> Self {
17 Self {
18 first,
19 last,
20 }
21 }
22}
23
24impl Default for User {
25 fn default() -> Self {
26 let first = "".to_string();
27 let last = "".to_string();
28 User::new(first, last)
29 }
30}
31
32
33fn main() {
34 let home = ".store".to_string();
35 let name = "fuzzy".to_string();
36
37 let mut builder = SurferBuilder::default();
38 builder.set_home(&home);
39
40 let data = User::default();
41 builder.add_struct(name.clone(), &data);
42
43 let mut surfer = Surfer::try_from(builder).unwrap();
44
45 let first = "John".to_string();
46 let last = "Doe".to_string();
47 let john_doe = User::new(first, last);
48
49 let first = "Jane".to_string();
50 let last = "Doe".to_string();
51 let jane_doe = User::new(first, last);
52
53 let users = vec![john_doe.clone(), jane_doe.clone()];
54 let _ = surfer.insert_structs(&name, &users).unwrap();
55 println!("===========================");
56 println!("Insert: John & Jane Doe");
57 println!("---------------------------");
58 println!("{:#?}", users);
59 println!("---------------------------");
60
61 block_thread(2);
62
63 let query = "deo";
64 let mut computed = surfer.read_structs::<User>(&name, query, Some(100), None).unwrap().unwrap();
65 computed.sort();
66 let mut expected = vec![];
67 expected.sort();
68 assert_eq!(computed, expected);
69
70 println!("====================================");
71 println!("Incorrect Query: '{}' Select: None", query);
72 println!("------------------------------------");
73 println!("{:#?}", computed);
74 println!("------------------------------------");
75
76 let fuzz = FuzzyWord::default();
77 let mod_query = fuzz.lookup(query);
78 assert!(mod_query.is_some());
79 let adjusted = mod_query.unwrap();
80 assert!(adjusted.len() >= 1);
81 let adjusted = adjusted.get(0).unwrap();
82 let mut computed = surfer.read_structs::<User>(&name, adjusted, Some(100), None).unwrap().unwrap();
83 computed.sort();
84 let mut expected = vec![john_doe.clone(), jane_doe.clone()];
85 expected.sort();
86 assert_eq!(computed, expected);
87
88 println!("====================================");
89 println!("Adjusted Query: '{}' Select: Jane & John Doe", adjusted);
90 println!("------------------------------------");
91 println!("{:#?}", computed);
92 println!("------------------------------------");
93
94
95 let path = surfer.which_index(&name).unwrap();
97 let _ = remove_dir_all(&path);
98 let _ = remove_dir_all(&home);
99}
100
101impl Eq for User {}
102
103
104impl Ord for User {
105 fn cmp(&self, other: &Self) -> Ordering {
106 if self.first == other.first && self.last == other.last {
107 return Ordering::Equal;
108 };
109 if self.first == other.first {
110 if self.last > other.last {
111 Ordering::Greater
112 } else {
113 Ordering::Less
114 }
115 } else {
116 if self.first > other.first {
117 Ordering::Greater
118 } else {
119 Ordering::Less
120 }
121 }
122 }
123}