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}