use crate::Filename;
use core::{convert, fmt, str};
#[derive(Debug, Clone, PartialEq)]
pub enum GBFSError {
HeaderInvalid,
FilenameTooLong(usize, usize),
Utf8Error(str::Utf8Error),
Cast(byte_slice_cast::Error),
NoSuchFile(Filename),
Truncated,
TooManyEntries(usize, usize),
}
impl fmt::Display for GBFSError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use GBFSError::*;
match self {
HeaderInvalid => write!(f, "Encountered invalid header"),
FilenameTooLong(expected, actual) => write!(
f,
"Encountered filename of invalid length: at most {} bytes are supported, but got {}",
expected, actual
),
GBFSError::Utf8Error(err) => write!(f, "Encountered filename that's not valid UTF-8 starting at position {} in filename", err.valid_up_to()),
Cast(err) => write!(f, "Failed to cast from u8 slice: {}", err),
NoSuchFile(name) => write!(f, "File \"{}\" does not exist in filesystem", name),
Truncated => write!(f, "Encountered truncated file entry"),
TooManyEntries(expected, actual) => write!(
f,
"Encountered archive with too many entries: at most {} entries are supported, but got {}",
expected, actual
),
}
}
}
impl convert::From<byte_slice_cast::Error> for GBFSError {
fn from(error: byte_slice_cast::Error) -> Self {
GBFSError::Cast(error)
}
}