fuzzy/
03_fuzzy_user_name.rs

1use 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    // Clean-up
96    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}