use crate::ArchiveFileID;
use hkdf::InvalidLength;
use std::error;
use std::fmt;
use std::io;
#[derive(Debug)]
pub enum Error {
IOError(io::Error),
WrongMagic,
UnsupportedVersion,
InvalidECCKeyFormat,
WrongBlockSubFileType,
UTF8ConversionError(std::string::FromUtf8Error),
FilenameTooLong,
WrongArchiveWriterState {
current_state: String,
expected_state: String,
},
AssertionError(String),
WrongReaderState(String),
WrongWriterState(String),
RandError(rand::Error),
PrivateKeyNeeded,
DeserializationError,
SerializationError,
MissingMetadata,
BadAPIArgument(String),
EndOfStream,
ConfigError(ConfigError),
DuplicateFilename,
AuthenticatedDecryptionWrongTag,
HKDFInvalidKeyLength,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl From<io::Error> for Error {
fn from(error: io::Error) -> Self {
Error::IOError(error)
}
}
impl From<std::string::FromUtf8Error> for Error {
fn from(error: std::string::FromUtf8Error) -> Self {
Error::UTF8ConversionError(error)
}
}
impl From<rand::Error> for Error {
fn from(error: rand::Error) -> Self {
Error::RandError(error)
}
}
impl From<bincode::ErrorKind> for Error {
fn from(_error: bincode::ErrorKind) -> Self {
Error::DeserializationError
}
}
impl From<Error> for io::Error {
fn from(error: Error) -> Self {
io::Error::new(io::ErrorKind::Other, format!("{}", error))
}
}
impl From<ConfigError> for Error {
fn from(error: ConfigError) -> Self {
match error {
ConfigError::PrivateKeyNotSet => Error::PrivateKeyNeeded,
_ => Error::ConfigError(error),
}
}
}
impl From<InvalidLength> for Error {
fn from(_error: InvalidLength) -> Self {
Error::HKDFInvalidKeyLength
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match &self {
Error::IOError(err) => Some(err),
Error::UTF8ConversionError(err) => Some(err),
Error::RandError(err) => Some(err),
Error::ConfigError(err) => Some(err),
_ => None,
}
}
}
#[derive(Debug)]
pub enum FailSafeReadError {
NoError,
UnexpectedEOFOnNextBlock,
IOErrorOnNextBlock(io::Error),
ErrorOnNextBlock(Error),
ErrorInFile(io::Error, String),
ArchiveFileIDReuse(ArchiveFileID),
FilenameReuse(String),
ArchiveFileIDAlreadyClose(ArchiveFileID),
ContentForUnknownFile(ArchiveFileID),
EOFForUnknownFile(ArchiveFileID),
UnfinishedFiles {
filenames: Vec<String>,
stopping_error: Box<FailSafeReadError>,
},
EndOfOriginalArchiveData,
FailSafeReadInternalError,
HashDiffers {
expected: Vec<u8>,
obtained: Vec<u8>,
},
}
impl fmt::Display for FailSafeReadError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl error::Error for FailSafeReadError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match &self {
FailSafeReadError::IOErrorOnNextBlock(err) => Some(err),
FailSafeReadError::ErrorOnNextBlock(err) => Some(err),
FailSafeReadError::ErrorInFile(err, _path) => Some(err),
_ => None,
}
}
}
#[derive(Debug)]
pub enum ConfigError {
IncoherentPersistentConfig,
CompressionLevelOutOfRange,
EncryptionKeyIsMissing,
PrivateKeyNotSet,
PrivateKeyNotFound,
ECIESComputationError,
}
impl fmt::Display for ConfigError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl error::Error for ConfigError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
None
}
}