this repo has no description
1use cid::Cid;
2use iroh_car::CarHeader;
3use std::io::Write;
4
5pub fn write_varint<W: Write>(mut writer: W, mut value: u64) -> std::io::Result<()> {
6 loop {
7 let mut byte = (value & 0x7F) as u8;
8 value >>= 7;
9 if value != 0 {
10 byte |= 0x80;
11 }
12 writer.write_all(&[byte])?;
13 if value == 0 {
14 break;
15 }
16 }
17 Ok(())
18}
19
20pub fn ld_write<W: Write>(mut writer: W, data: &[u8]) -> std::io::Result<()> {
21 write_varint(&mut writer, data.len() as u64)?;
22 writer.write_all(data)?;
23 Ok(())
24}
25
26pub fn encode_car_header(root_cid: &Cid) -> Result<Vec<u8>, String> {
27 let header = CarHeader::new_v1(vec![*root_cid]);
28 let header_cbor = header
29 .encode()
30 .map_err(|e| format!("Failed to encode CAR header: {:?}", e))?;
31 let mut result = Vec::new();
32 write_varint(&mut result, header_cbor.len() as u64)
33 .expect("Writing to Vec<u8> should never fail");
34 result.extend_from_slice(&header_cbor);
35 Ok(result)
36}