pub mod build;
pub mod compression;
pub mod decoding;
pub mod decompression;
pub mod encoding;
pub mod parse;
use std::panic::Location;
use super::{
BuildProblem, CompressionProblem, DecodingProblem, DecompressionProblem, EncodingProblem,
ParseProblem,
};
#[derive(thiserror::Error, Debug)]
#[non_exhaustive]
pub enum Error {
#[error("build: {0}")]
Build(#[from] BuildProblem),
#[error("parse: {0}")]
Parse(#[from] ParseProblem),
#[error("compression: {0}")]
Compression(#[from] CompressionProblem),
#[error("decompression: {0}")]
Decompression(#[from] DecompressionProblem),
#[error("encoding: {0}")]
Encoding(#[from] EncodingProblem),
#[error("decoding: {0}")]
Decoding(#[from] DecodingProblem),
#[error("read failed: {0} bytes ({1}) at {2}")]
ReadFailed(usize, #[source] std::io::Error, &'static Location<'static>),
#[error("seek failed: {0} at {1}")]
SeekFailed(#[source] std::io::Error, &'static Location<'static>),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
}
pub type Result<T> = std::result::Result<T, Error>;
macro_rules! ensure {
($cond:expr, $err:expr) => {
if !$cond {
return Err($err.into());
}
};
}
pub(crate) use ensure;
pub trait ProblemLocation {
#[track_caller]
fn current() -> &'static std::panic::Location<'static> { std::panic::Location::caller() }
}
impl ProblemLocation for Location<'_> {}