use bcp_types::error::TypeError;
use bcp_wire::WireError;
#[derive(Debug, thiserror::Error)]
pub enum DecodeError {
#[error("invalid header: {0}")]
InvalidHeader(WireError),
#[error("block body too large: {size} bytes at offset {offset}")]
BlockTooLarge { size: usize, offset: usize },
#[error("required field {field_name} (id={field_id}) missing in {block_type} block")]
MissingField {
block_type: &'static str,
field_name: &'static str,
field_id: u64,
},
#[error("invalid UTF-8 in field {field_name} of {block_type} block")]
InvalidUtf8 {
block_type: &'static str,
field_name: &'static str,
},
#[error("payload does not end with END sentinel")]
MissingEndSentinel,
#[error("unexpected data after END sentinel ({extra_bytes} bytes)")]
TrailingData { extra_bytes: usize },
#[error("zstd decompression failed: {0}")]
DecompressFailed(String),
#[error("decompressed size {actual} exceeds limit {limit}")]
DecompressionBomb { actual: usize, limit: usize },
#[error("unresolved reference: BLAKE3 hash not found in content store")]
UnresolvedReference { hash: [u8; 32] },
#[error("block has IS_REFERENCE flag but no content store was provided")]
MissingContentStore,
#[error(transparent)]
Type(#[from] TypeError),
#[error(transparent)]
Wire(#[from] WireError),
#[error(transparent)]
Io(#[from] std::io::Error),
}