1use std::collections::HashMap;
2
3type TagKey = &'static str;
4type TagValue = String;
5type TagBucketInner = HashMap<TagKey, TagValue>;
6
7#[derive(Clone, Default)]
8pub struct TagBucket(TagBucketInner);
9
10#[macro_export]
11macro_rules! tag {
12 ($($key: expr => $value: expr),*) => {{
13 #[allow(unused_mut)]
14 let mut map = std::collections::HashMap::default();
15 $(
16 map.insert($key, $value);
17 )*
18 $crate::TagBucket::new(map)
19 }};
20}
21
22impl TagBucket {
23 pub fn new(map: TagBucketInner) -> TagBucket {
24 TagBucket(map)
25 }
26
27 pub fn get(&self, key: TagKey) -> Option<TagValue> {
28 self.0.get(key).cloned()
29 }
30
31 pub fn insert(&mut self, key: TagKey, val: TagValue) {
32 self.0.insert(key, val);
33 }
34
35 pub fn unchecked_get(&self, key: TagKey) -> TagValue {
36 self.0.get(key).unwrap().clone()
37 }
38
39 pub fn get_bytes(&self, key: TagKey) -> Option<Vec<u8>> {
40 let wrapped_value = self.0.get(key).cloned();
41 if let Some(v) = wrapped_value {
42 return Some(v.as_bytes().to_vec());
43 }
44 None
45 }
46}