linkspace/commons/
file.rs
1use anyhow::Context;
2use linkspace_core::point::NO_PTR;
3
4use crate::{point::lk_linkpoint_ref, prelude::*};
5
6pub const PART_SIZE: usize = 65536 - 1024;
7
8pub fn lkc_file_in<'o>(
9 file: &'o [u8],
10 space: &'o Space,
11 out: &mut dyn for<'a> FnMut(Vec<PointParts<'a>>) -> LkResult<LkHash>,
12) -> LkResult<LkHash> {
13 let mut it = file
14 .chunks(PART_SIZE)
15 .enumerate()
16 .map(|(i, chunk)| (Stamp::from(i as u64), chunk));
17 let len = it.len();
18
19 let (stamp, chunk) = it.next().context("empty file?")?;
20
21 let tail = lk_linkpoint_ref(space.domain, space.group, &space.path, chunk, &[], stamp)?;
22 let mut links = vec![
23 Link {
24 ptr: NO_PTR,
25 tag: ab(b"prev_chunk")
26 };
27 len
28 ]
29 .into_boxed_slice();
30 let mut list = vec![tail];
31 for ((stamp, chunk), link) in it.zip(links.iter_mut()) {
32 link.ptr = list.last().unwrap().hash();
33 let tail = lk_linkpoint_ref(
34 space.domain,
35 space.group,
36 &space.path,
37 chunk,
38 std::slice::from_ref(link),
39 stamp,
40 )?;
41 list.push(tail);
42 }
43 out(list)
44}