#![allow(dead_code)]
use std::collections::HashMap;
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct PackEntry {
pub key: String,
pub data: Vec<u8>,
}
#[derive(Debug, Clone, Default)]
#[allow(dead_code)]
pub struct DataPack {
entries: HashMap<String, Vec<u8>>,
}
#[allow(dead_code)]
pub fn new_data_pack() -> DataPack {
DataPack::default()
}
#[allow(dead_code)]
pub fn pack_insert(pack: &mut DataPack, key: &str, data: Vec<u8>) {
pack.entries.insert(key.to_string(), data);
}
#[allow(dead_code)]
pub fn pack_get<'a>(pack: &'a DataPack, key: &str) -> Option<&'a [u8]> {
pack.entries.get(key).map(|v| v.as_slice())
}
#[allow(dead_code)]
pub fn pack_contains(pack: &DataPack, key: &str) -> bool {
pack.entries.contains_key(key)
}
#[allow(dead_code)]
pub fn pack_len(pack: &DataPack) -> usize {
pack.entries.len()
}
#[allow(dead_code)]
pub fn pack_remove(pack: &mut DataPack, key: &str) -> bool {
pack.entries.remove(key).is_some()
}
#[allow(dead_code)]
pub fn pack_keys(pack: &DataPack) -> Vec<String> {
let mut keys: Vec<String> = pack.entries.keys().cloned().collect();
keys.sort();
keys
}
#[allow(dead_code)]
pub fn pack_to_json(pack: &DataPack) -> String {
let mut out = String::from("{");
let mut keys = pack_keys(pack);
keys.sort();
for (i, key) in keys.iter().enumerate() {
let data = &pack.entries[key];
let arr: Vec<String> = data.iter().map(|b| b.to_string()).collect();
out.push_str(&format!("\"{}\":[{}]", key, arr.join(",")));
if i + 1 < pack.entries.len() {
out.push(',');
}
}
out.push('}');
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_data_pack() {
let p = new_data_pack();
assert_eq!(pack_len(&p), 0);
}
#[test]
fn test_insert_and_get() {
let mut p = new_data_pack();
pack_insert(&mut p, "foo", vec![1, 2, 3]);
assert_eq!(pack_get(&p, "foo"), Some([1u8, 2, 3].as_slice()));
}
#[test]
fn test_pack_contains() {
let mut p = new_data_pack();
pack_insert(&mut p, "bar", vec![]);
assert!(pack_contains(&p, "bar"));
assert!(!pack_contains(&p, "baz"));
}
#[test]
fn test_pack_len() {
let mut p = new_data_pack();
pack_insert(&mut p, "a", vec![]);
pack_insert(&mut p, "b", vec![]);
assert_eq!(pack_len(&p), 2);
}
#[test]
fn test_pack_remove() {
let mut p = new_data_pack();
pack_insert(&mut p, "x", vec![42]);
assert!(pack_remove(&mut p, "x"));
assert!(!pack_contains(&p, "x"));
assert!(!pack_remove(&mut p, "x"));
}
#[test]
fn test_pack_keys() {
let mut p = new_data_pack();
pack_insert(&mut p, "c", vec![]);
pack_insert(&mut p, "a", vec![]);
pack_insert(&mut p, "b", vec![]);
assert_eq!(pack_keys(&p), vec!["a", "b", "c"]);
}
#[test]
fn test_pack_to_json() {
let mut p = new_data_pack();
pack_insert(&mut p, "k", vec![1, 2]);
let json = pack_to_json(&p);
assert!(json.contains("\"k\""));
assert!(json.starts_with('{'));
assert!(json.ends_with('}'));
}
#[test]
fn test_overwrite_entry() {
let mut p = new_data_pack();
pack_insert(&mut p, "k", vec![1]);
pack_insert(&mut p, "k", vec![2, 3]);
assert_eq!(pack_get(&p, "k"), Some([2u8, 3].as_slice()));
assert_eq!(pack_len(&p), 1);
}
}