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}