#[path="support/index_image.rs"] mod index_image; fn build_index()->Vec { use index_image::Node; [ ("cat",1,Some(1),Some(2)), ("apple",1,Some(3),Some(4)), ("fox",4,Some(5),Some(6)), ("ant",1,None,None), ("bat",1,None,Some(7)), ("dog",1,None,None), ("hare",1,None,Some(8)), ("brown",1,None,None), ("quick",1,None,None) ] .into_iter().map(|(word,count,left,right)|Node {word:word.as_bytes().to_vec(),count,left,right}).collect() } fn main() { use index_image::{Node, encode_nodes, decode_nodes, lookup}; // accompanying safe codec let index: Vec = build_index(); // the omitted tree-building context let mut image: Vec = encode_nodes(&index).unwrap(); let decoded = decode_nodes(&image); let ok = decoded.is_ok(); let loaded = decoded.unwrap_or_default(); println!("loaded {ok}, {} nodes, 'fox' = {}", loaded.len(), lookup(&loaded, b"fox")); assert_eq!(loaded,index); for word in [b"ant".as_slice(),b"apple",b"bat",b"brown",b"cat",b"dog",b"fox",b"hare",b"quick"] {assert!(lookup(&loaded,word)>0);} assert!(decode_nodes(&image[..image.len()-1]).is_err()); assert!(decode_nodes(b"bad").is_err()); let mut edited=image.clone();edited[9]=b'z';assert!(decode_nodes(&edited).is_ok()); let mut huge=b"RIDX".to_vec();huge.extend_from_slice(&u32::MAX.to_le_bytes());assert!(decode_nodes(&huge).is_err()); let empty=encode_nodes(&[]).unwrap();assert_eq!(decode_nodes(&empty).unwrap(),[]); let raw=vec![Node {word:vec![0xff],count:1,left:None,right:None}];assert_eq!(decode_nodes(&encode_nodes(&raw).unwrap()).unwrap(),raw); }