Skip to main content

load_freedesktop/
fitername.rs

1use 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