load_freedesktop/
fitername.rs1use std::sync::Arc;
2
3#[derive(Debug)]
4struct FilterNode {
5 val: char,
6 child: Option<Arc<FilterNode>>,
7}
8#[derive(Debug, Clone)]
9pub struct FilterName {
10 nodes: Vec<Arc<FilterNode>>,
11 space_nodes: Vec<Arc<FilterNode>>,
12}
13impl serde::Serialize for FilterName{
14 fn serialize<S : serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>
15 {
16 serializer.serialize_none()
17 }
18}
19impl<'de> serde::Deserialize<'de> for FilterName{
20 fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
21 where
22 D: serde::Deserializer<'de> {
23 Ok(
24 Self{
25 nodes : Vec::new(),
26 space_nodes : Vec::new(),
27 }
28 )
29 }
30}
31impl FilterName {
32 fn get_char(
33 mut chars: std::str::Chars<'_>,
34 nodes_vec: &mut Vec<Arc<FilterNode>>,
35 space_vec: &mut Vec<Arc<FilterNode>>,
36 ) -> Option<Arc<FilterNode>> {
37 match chars.next() {
38 None => None,
39 Some(c) => {
40 let node = Some(Arc::new(FilterNode {
41 val: c,
42 child: Self::get_char(chars, nodes_vec, space_vec),
43 }));
44 if let Some(node) = node.as_ref() {
45 nodes_vec.push(Arc::clone(node));
46 if space_vec.is_empty() || space_vec.last().unwrap().val.is_whitespace() {
47 space_vec.push(Arc::clone(node));
48 }
49 }
50 node
51 }
52 }
53 }
54 pub fn new(word: &str) -> Self {
55 let mut nvec = Vec::new();
56 let mut svec = Vec::new();
57 let word = word.to_lowercase();
58 let _ = Self::get_char(word.chars(), &mut nvec, &mut svec);
59 nvec.reverse();
60 svec.reverse();
61 Self {
62 nodes: nvec,
63 space_nodes: svec,
64 }
65 }
66 pub fn print(&self) {
67 let mut cnode = Arc::clone(&self.nodes[0]);
68 loop {
69 println!("{:?}", cnode.val);
70 match cnode.child.as_ref() {
71 None => {
72 break;
73 }
74 Some(node) => {
75 cnode = Arc::clone(node);
76 }
77 }
78 }
79 }
80 pub fn contains_short(&self, search_var: &str) -> bool {
81 let search_var = search_var
82 .split_whitespace()
83 .filter_map(|s| s.chars().next())
84 .collect::<String>();
85 let whpcl = self.space_nodes.iter().map(|c| c.val).collect::<String>();
86 whpcl.to_lowercase().contains(&search_var.to_lowercase())
87 }
88 pub fn contains(&self, search_var: &str) -> bool {
89 for rnode in &self.nodes {
90 let mut chars = search_var.chars();
91 let mut cnode = Arc::clone(rnode);
92 loop {
93 let sc = chars.next();
94 if sc.is_none() {
95 return true;
96 }
97 let sc = sc.unwrap();
98 if cnode.val != sc {
99 break;
100 }
101 if cnode.child.is_none() {
102 if chars.next().is_none() {
103 return true;
104 }
105 break;
106 }
107 cnode = Arc::clone(cnode.child.as_ref().unwrap());
108 }
109 }
110 false
111 }
112}
113