1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
use thiserror::Error;
/// Errors returned while loading/parsing a serialized SymCache.
///
/// After a SymCache was successfully parsed via [`SymCache::parse`](crate::SymCache::parse), an Error that occurs during
/// access of any data indicates either corruption of the serialized file, or a bug in the
/// converter/serializer.
#[derive(Debug, Error, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum ErrorKind {
/// The buffer is not correctly aligned.
///
/// This variant is currently unused.
#[error("source buffer is not correctly aligned")]
BufferNotAligned,
/// The header's size doesn't match our expected size.
///
/// This variant is currently unused.
#[error("header is too small")]
HeaderTooSmall,
/// The file was generated by a system with different endianness.
#[error("endianness mismatch")]
WrongEndianness,
/// The file magic does not match.
#[error("wrong format magic")]
WrongFormat,
/// The format version in the header is wrong/unknown.
#[error("unknown SymCache version")]
WrongVersion,
/// The self-advertised size of the buffer is not correct.
///
/// This variant is currently unused.
#[error("incorrect buffer length")]
BadFormatLength,
/// The debug file could not be converted to a symcache.
#[error("bad debug file")]
BadDebugFile,
/// Header could not be parsed from the cache file.
#[error("could not read header")]
InvalidHeader,
/// File data could not be parsed from the cache file.
#[error("could not read files")]
InvalidFiles,
/// Function data could not be parsed from the cache file.
#[error("could not read functions")]
InvalidFunctions,
/// Source location data could not be parsed from the cache file.
#[error("could not read source locations")]
InvalidSourceLocations,
/// Range data could not be parsed from the cache file.
#[error("could not read ranges")]
InvalidRanges,
/// The header claimed an incorrect number of string bytes.
#[error("expected {expected} string bytes, found {found}")]
UnexpectedStringBytes {
/// Expected number of string bytes.
expected: usize,
/// Number of string bytes actually found in the cache file.
found: usize,
},
}
/// An error returned when handling a [`SymCache`](crate::SymCache).
#[derive(Debug, Error)]
#[error("{kind}")]
pub struct Error {
pub(crate) kind: ErrorKind,
#[source]
pub(crate) source: Option<Box<dyn std::error::Error + Send + Sync + 'static>>,
}
impl Error {
/// Creates a new SymCache error from a known kind of error as well as an
/// arbitrary error payload.
pub(crate) fn new<E>(kind: ErrorKind, source: E) -> Self
where
E: Into<Box<dyn std::error::Error + Send + Sync>>,
{
let source = Some(source.into());
Self { kind, source }
}
/// Returns the corresponding [`ErrorKind`] for this error.
pub fn kind(&self) -> ErrorKind {
self.kind
}
}
impl From<ErrorKind> for Error {
fn from(kind: ErrorKind) -> Self {
Self { kind, source: None }
}
}