Fast and robust atproto CAR file processing in rust

fix rkeys

Changed files
+9 -23
src
+9 -23
src/walk.rs
··· 30 30 if let Some(left_cid) = node.left { 31 31 out.push(Need::Node(left_cid)); 32 32 } 33 - let prefix = if !node.entries.is_empty() { 34 - String::from_utf8(node.entries[0].keysuffix.to_vec()).unwrap() 35 - } else { 36 - "".to_string() 37 - }; 38 33 34 + let mut prefix = vec![]; 39 35 for entry in &node.entries { 40 - let pre = &prefix[..entry.prefix_len]; 41 - let suf = String::from_utf8(entry.keysuffix.to_vec()).unwrap(); 42 - let rkey = format!("{pre}{suf}"); 43 - // if !rkey.contains('/') { 44 - // println!("weird for entries: {:?}", node.entries); 45 - // } 36 + let mut rkey = vec![]; 37 + // TODO: *definitely* need to index in a non-panicky way 38 + rkey.extend_from_slice(&prefix[..entry.prefix_len]); 39 + rkey.extend_from_slice(&entry.keysuffix); 40 + prefix = rkey.clone(); 41 + 46 42 out.push(Need::Record { 47 - rkey: rkey.into_bytes(), 43 + rkey: rkey, 48 44 cid: entry.value, 49 45 }); 50 - // let suffix = entry.keysuffix; 51 - // let mut rkey = String::new(); 52 - // rkey.extend_from_slice(&prefix[..entry.prefix_len]); 53 - // rkey.extend_from_slice(&suffix); 54 - // if i == 0 { 55 - // prefix.extend_from_slice(&suffix); 56 - // } 57 - // out.push(Need::Record { 58 - // rkey, 59 - // cid: entry.value, 60 - // }); 46 + 61 47 if let Some(child_cid) = entry.tree { 62 48 out.push(Need::Node(child_cid)); 63 49 }