1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use std::collections::{VecDeque, HashMap};
use cid::Cid;
use ipld::raw::RawCodec;
use rust_car::Ipld;
use rust_car::reader::{self, CarReader};
use rust_car::unixfs::{UnixFs, FileType};
fn walk(vecq: &mut VecDeque<Cid>, reader: &mut impl CarReader) {
let mut cache: HashMap<Cid, String> = HashMap::new();
let raw_code: u64 = RawCodec.into();
while let Some(file_cid) = vecq.pop_front() {
let codec = file_cid.codec();
let file_n = cache.get(&file_cid).map_or(file_cid.to_string(), |c| c.to_string());
println!("{file_n}");
if codec == raw_code {
continue;
}
let file_ipld: Ipld = reader.ipld(&file_cid).unwrap();
match file_ipld {
m @ Ipld::Map(_) => {
let unixfs: UnixFs = m.try_into().unwrap();
match unixfs.file_type() {
FileType::Directory => {},
_=> continue,
}
for n in unixfs.links().into_iter() {
let cid = n.hash();
cache.insert(cid, file_n.clone() + "/" + n.name_ref());
vecq.push_back(cid);
}
}
_ => {}
}
}
}
fn main() {
let file_name = std::env::args().nth(1);
let path = file_name.as_ref().map(|f| f.into()).unwrap_or_else(|| {
let file = std::path::Path::new("test");
file.join("carv1-basic.car")
});
let file = std::fs::File::open(path).unwrap();
let mut reader = reader::new_v1(file).unwrap();
let roots = reader.header().roots();
let mut queue: VecDeque<Cid> = VecDeque::new();
for r in roots.iter() {
queue.push_front(*r);
walk(&mut queue, &mut reader);
}
}