use displaydoc::Display;
use nom::{error::ErrorKind, Offset};
use std::{io, num::TryFromIntError};
use thiserror::Error;
#[derive(Error, Debug, Display)]
pub enum FileError {
IO(#[from] io::Error),
Count(TryFromIntError),
Incomplete,
Parse {
addr: u64,
offset: usize,
code: ErrorKind,
},
StringEncoding(String),
#[cfg(debug_assertions)]
NotImplemented,
Custom(&'static str),
}
pub trait ParseAt<T>: Sized {
fn at(self, addr: u64, slice: &[u8]) -> Result<T, FileError>;
}
impl<T> ParseAt<T> for Result<T, nom::error::Error<&[u8]>> {
fn at(self, addr: u64, slice: &[u8]) -> Result<T, FileError> {
self.map_err(|e| FileError::Parse {
addr,
code: e.code,
offset: slice.offset(e.input),
})
}
}
pub type FileResult<T> = Result<T, FileError>;