use std::collections::HashMap;
use serde_json::Value;
use crate::{bitstream::{BitWriter, BitReader}, varint, Error};
pub fn collect_keys(json: &Value) -> HashMap<String, u64> {
let mut freq_map = HashMap::new();
collect_keys_recursive(json, &mut freq_map);
freq_map
}
fn collect_keys_recursive(value: &Value, freq_map: &mut HashMap<String, u64>) {
match value {
Value::Object(map) => {
for (key, val) in map {
*freq_map.entry(key.clone()).or_insert(0) += 1;
collect_keys_recursive(val, freq_map);
}
},
Value::Array(arr) => {
for item in arr {
collect_keys_recursive(item, freq_map);
}
},
_ => {
}
}
}
pub fn write_dictionary(writer: &mut BitWriter, freq_map: &HashMap<String, u64>) {
varint::write_uleb128(writer, freq_map.len() as u64);
let mut sorted_keys: Vec<_> = freq_map.iter().collect();
sorted_keys.sort_by(|a, b| a.0.cmp(b.0));
for (key, &freq) in sorted_keys {
let key_bytes = key.as_bytes();
varint::write_uleb128(writer, key_bytes.len() as u64);
for &byte in key_bytes {
writer.write_byte(byte);
}
varint::write_uleb128(writer, freq);
}
}
pub fn read_dictionary(reader: &mut BitReader) -> Result<HashMap<String, u64>, Error> {
let mut freq_map = HashMap::new();
let key_count = varint::read_uleb128(reader)?;
for _ in 0..key_count {
let key_len = varint::read_uleb128(reader)? as usize;
let mut key_bytes = Vec::with_capacity(key_len);
for _ in 0..key_len {
key_bytes.push(reader.read_byte()?);
}
let key = String::from_utf8(key_bytes)?;
let freq = varint::read_uleb128(reader)?;
freq_map.insert(key, freq);
}
Ok(freq_map)
}