cat_cid/
cat_cid.rs

1use cid::Cid;
2use rust_car::{
3    error::CarError,
4    reader::{self, CarReader},
5    unixfs::UnixFs,
6    utils::cat_ipld,
7};
8
9/// Cat the file in car file by file id
10/// e.g. ```cargo run --example cat_file bafkreiabltrd5zm73pvi7plq25pef3hm7jxhbi3kv4hapegrkfpkqtkbme```
11/// the example cat file with cid in carv1-basic.car
12fn main() {
13    // let cid = std::env::args().nth(1).expect("use cid as argument");
14    let cid = "bafkreiaqv66m5nd6mwgkk7h5lwqnjzj54s4f7knmnrjhb7ylzqfg2vdo54";
15    let file = std::path::Path::new("test");
16    let file = file.join("carv1-basic.car");
17    let file = std::fs::File::open(file).unwrap();
18    let mut reader = reader::new_v1(file).unwrap();
19    let roots = reader.header().roots();
20    let file_cid = Cid::try_from(cid).expect("cid format error");
21    for r in roots.iter() {
22        let root_ipld = reader.ipld(r).unwrap();
23        let root: Result<UnixFs, CarError> = root_ipld.try_into();
24        let root_dir = root.unwrap();
25        let count = root_dir
26            .links()
27            .iter()
28            .filter(|u| u.hash() == file_cid)
29            .count();
30        if count > 0 {
31            cat_ipld(&mut reader, file_cid).unwrap();
32        }
33    }
34}