Skip to main content

heddle_object_model/compact/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Lossless columnar encodings used by background compact repacks.
3
4mod blob;
5mod dictionary;
6mod extract;
7mod io;
8mod limits;
9mod state;
10mod state_decode;
11mod tree;
12
13pub use blob::{decode_blob_frame, encode_blob_frame, is_blob_frame};
14pub use extract::extract_state;
15pub use state::{encode_state_frame, is_state_frame};
16pub use state_decode::decode_state_frame;
17use thiserror::Error;
18pub use tree::{
19    decode_tree_frame, encode_tree_frame, encoded_tree_size, extract_tree, is_tree_frame,
20};
21
22/// Compact metadata encoding failure.
23#[derive(Debug, Error)]
24pub enum CompactError {
25    /// The frame is malformed, truncated, or internally inconsistent.
26    #[error("invalid compact frame: {0}")]
27    Invalid(String),
28    /// The requested object is not present after a verified reconstruction.
29    #[error("compact frame does not contain the requested object")]
30    Missing,
31    /// A decoded tree violates the native tree invariants.
32    #[error(transparent)]
33    Tree(#[from] crate::object::TreeError),
34    /// A decoded Git object id is invalid.
35    #[error("invalid compact git object id: {0}")]
36    GitObjectId(String),
37    /// A decoded spool id is invalid.
38    #[error("invalid compact spool id: {0}")]
39    SpoolId(String),
40    /// A compact verification value cannot be serialized losslessly.
41    #[error(transparent)]
42    MessagePackEncode(#[from] rmp_serde::encode::Error),
43    /// A compact verification value cannot be deserialized losslessly.
44    #[error(transparent)]
45    MessagePackDecode(#[from] rmp_serde::decode::Error),
46}
47
48pub(crate) type Result<T> = std::result::Result<T, CompactError>;
49
50pub(crate) fn invalid(message: impl Into<String>) -> CompactError {
51    CompactError::Invalid(message.into())
52}
53
54#[cfg(test)]
55mod hostile;
56#[cfg(test)]
57mod tests;