#[doc(hidden)]
#[derive(Debug, thiserror::Error)]
pub enum SparseServeError {
#[error("sparse build: {0}")]
Build(#[from] mkit_core::sparse::SparseError),
}
#[doc(hidden)]
pub fn build_sparse_response_from_tree(
tree: &mkit_core::object::Tree,
filter: &[std::path::PathBuf],
) -> Result<mkit_core::sparse::SparseResponse, SparseServeError> {
let (entries, manifest, proof) = mkit_core::sparse::build_sparse(tree, filter)?;
Ok(mkit_core::sparse::SparseResponse {
manifest,
entries,
proof,
})
}
#[cfg(test)]
mod tests {
use super::*;
use mkit_core::hash::ZERO;
use mkit_core::object::{EntryMode, Tree, TreeEntry};
use std::path::PathBuf;
fn entry(name: &[u8]) -> TreeEntry {
TreeEntry {
name: name.to_vec(),
mode: EntryMode::Blob,
object_hash: ZERO,
}
}
#[test]
fn builds_response_for_filtered_subtree() {
let tree = Tree {
entries: vec![entry(b"aa"), entry(b"ab")],
};
let resp = build_sparse_response_from_tree(&tree, &[PathBuf::from("aa")])
.expect("valid sorted tree builds a sparse response");
assert_eq!(resp.entries.len(), 1);
assert_eq!(resp.entries[0].name, b"aa");
}
#[test]
fn unsorted_tree_is_rejected() {
let tree = Tree {
entries: vec![entry(b"ab"), entry(b"aa")],
};
assert!(build_sparse_response_from_tree(&tree, &[PathBuf::from("aa")]).is_err());
}
}