pub fn parse(data: &str) -> Vec<(u16, u32)> {
let lines = data.lines();
let mut codings = vec![];
for line in lines {
let coding = parse_line(line);
codings.push(coding);
}
codings
}
fn parse_line(line: &str) -> (u16, u32) {
let mut msb = vec![];
for &b in &line.as_bytes()[12..45] {
match b {
b'1' => msb.push(true),
b'0' => msb.push(false),
b'|' | b' ' => {}
_ => panic!("unexpected byte; {:?}", b),
}
}
let lsb = u32::from_str_radix(&line[50..59].trim().to_string(), 16).expect("Invalid hex");
let len = msb.len() as u16;
(len, lsb)
}
#[cfg(test)]
mod tests {
use std::fs;
use std::path::Path;
use super::*;
#[test]
fn parses_huffman_table() {
let path = Path::new("assets/hpack-huffman.txt");
let data = fs::read_to_string(path).expect("Can't read file.");
let table = parse(&data);
assert_eq!(table.len(), 257);
let item = table[10];
assert_eq!(item.0, 30);
assert_eq!(item.1, 0x3ffffffc);
let item = table[32];
assert_eq!(item.0, 6);
assert_eq!(item.1, 0x14);
let item = table.last().unwrap();
assert_eq!(item.0, 30);
assert_eq!(item.1, 0x3fffffff);
}
}