apt_parser/
case_map.rs

1use std::collections::{hash_map::Iter, HashMap};
2
3#[derive(Debug, Clone)]
4pub struct CaseMap {
5	map: HashMap<String, String>,
6}
7
8impl CaseMap {
9	pub fn new() -> CaseMap {
10		CaseMap {
11			map: HashMap::new(),
12		}
13	}
14
15	fn get_proper_key<'a>(&'a self, key: &'a str) -> Option<&str> {
16		if self.map.contains_key(key) {
17			return Some(key);
18		}
19
20		let case_key = format!("__cased__{}", key.to_lowercase());
21		if self.map.contains_key(&case_key) {
22			let real_key = match self.map.get(&case_key) {
23				Some(real_key) => real_key,
24				None => {
25					return None;
26				}
27			};
28
29			return Some(real_key);
30		}
31
32		None
33	}
34
35	pub fn insert(&mut self, key: &str, value: &str) {
36		let case_key = format!("__cased__{}", key.to_lowercase());
37		self.map.insert(key.to_owned(), value.to_owned());
38		self.map.insert(case_key, key.to_owned());
39	}
40
41	pub fn get(&self, key: &str) -> Option<&String> {
42		match self.get_proper_key(key) {
43			Some(key) => self.map.get(key),
44			None => None,
45		}
46	}
47
48	pub fn contains_key(&self, key: &str) -> bool {
49		match self.get_proper_key(key) {
50			Some(_) => true,
51			None => false,
52		}
53	}
54
55	pub fn len(&self) -> usize {
56		self.map.len() / 2
57	}
58
59	pub fn iter(&self) -> Iter<'_, String, String> {
60		self.map.iter()
61	}
62}