use thiserror::Error;
use crate::kairos::DecodeError as KairosDecodeError;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MetathesesDecodeBudget(usize);
impl MetathesesDecodeBudget {
#[must_use]
pub const fn new(max_testimonies: usize) -> Self {
Self(max_testimonies)
}
#[must_use]
pub const fn max_testimonies(self) -> usize {
self.0
}
}
#[non_exhaustive]
#[derive(Error, Debug, Clone, Copy, PartialEq, Eq)]
pub enum MetathesesDecodeError {
#[error("unknown metatheses wire version: {0:#04x}")]
UnknownVersion(u8),
#[error("unexpected metatheses frame length: expected at least {expected}, found {found}")]
UnexpectedLength {
expected: usize,
found: usize,
},
#[error("metatheses frame declares {count} testimonies, past the budget's {budget}")]
TooManyTestimonies {
count: u64,
budget: u64,
},
#[error("non-canonical metatheses: zero index for station {station}")]
ZeroDot {
station: u32,
},
#[error("non-canonical metatheses: dot {found:?} is not strictly after {previous:?}")]
NonAscendingTestimonies {
previous: (u32, u64),
found: (u32, u64),
},
#[error("non-canonical metatheses: unknown anchor tag {tag:#04x}")]
BadAnchorTag {
tag: u8,
},
#[error("metatheses rank frame: {0}")]
Rank(#[source] KairosDecodeError),
}