1use std::collections::HashMap;
2use serde_json::Value;
3use crate::{bitstream::{BitWriter, BitReader}, varint, Error};
4
5pub fn collect_keys(json: &Value) -> HashMap<String, u64> {
7 let mut freq_map = HashMap::new();
8 collect_keys_recursive(json, &mut freq_map);
9 freq_map
10}
11
12fn collect_keys_recursive(value: &Value, freq_map: &mut HashMap<String, u64>) {
14 match value {
15 Value::Object(map) => {
16 for (key, val) in map {
18 *freq_map.entry(key.clone()).or_insert(0) += 1;
19 collect_keys_recursive(val, freq_map);
21 }
22 },
23 Value::Array(arr) => {
24 for item in arr {
26 collect_keys_recursive(item, freq_map);
27 }
28 },
29 _ => {
30 }
32 }
33}
34
35pub fn write_dictionary(writer: &mut BitWriter, freq_map: &HashMap<String, u64>) {
38 varint::write_uleb128(writer, freq_map.len() as u64);
40
41 let mut sorted_keys: Vec<_> = freq_map.iter().collect();
43 sorted_keys.sort_by(|a, b| a.0.cmp(b.0));
44
45 for (key, &freq) in sorted_keys {
47 let key_bytes = key.as_bytes();
48
49 varint::write_uleb128(writer, key_bytes.len() as u64);
51
52 for &byte in key_bytes {
54 writer.write_byte(byte);
55 }
56
57 varint::write_uleb128(writer, freq);
59 }
60}
61
62pub fn read_dictionary(reader: &mut BitReader) -> Result<HashMap<String, u64>, Error> {
65 let mut freq_map = HashMap::new();
66
67 let key_count = varint::read_uleb128(reader)?;
69
70 for _ in 0..key_count {
71 let key_len = varint::read_uleb128(reader)? as usize;
73
74 let mut key_bytes = Vec::with_capacity(key_len);
76 for _ in 0..key_len {
77 key_bytes.push(reader.read_byte()?);
78 }
79
80 let key = String::from_utf8(key_bytes)?;
82
83 let freq = varint::read_uleb128(reader)?;
85
86 freq_map.insert(key, freq);
87 }
88
89 Ok(freq_map)
90}