use thiserror::Error;
#[derive(Debug, Error)]
pub enum CoreError {
#[error("memory budget exceeded: working set {needed} bytes > budget {budget} bytes")]
BudgetExceeded {
needed: u64,
budget: u64,
},
#[error("malformed record: {0}")]
MalformedRecord(String),
#[error("invalid contig id {0}")]
InvalidContig(u32),
#[error("read length {len} exceeds declared --max-read-len {declared}; raise --max-read-len or drop --enforce")]
ReadExceedsDeclaredLength {
len: u32,
declared: u32,
},
#[error("io error: {0}")]
Io(#[from] std::io::Error),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn budget_exceeded_displays_both_numbers() {
let e = CoreError::BudgetExceeded {
needed: 4096,
budget: 1024,
};
let msg = e.to_string();
assert!(
msg.contains("4096"),
"message should report needed bytes: {msg}"
);
assert!(
msg.contains("1024"),
"message should report budget bytes: {msg}"
);
}
#[test]
fn io_error_converts_via_from() {
let io = std::io::Error::new(std::io::ErrorKind::NotFound, "missing");
let e: CoreError = io.into();
assert!(matches!(e, CoreError::Io(_)));
}
}