use crate::phys::{ChecksumType, EndianOrder};
use core::fmt;
#[cfg(feature = "std")]
use std::error;
#[derive(Debug)]
pub enum ChecksumError {
Unsupported {
checksum: ChecksumType,
implementation: &'static str,
},
}
impl fmt::Display for ChecksumError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ChecksumError::Unsupported {
checksum,
implementation,
} => {
write!(
f,
"Unsupported Checksum {checksum} implementation {implementation}"
)
}
}
}
}
#[cfg(feature = "std")]
impl error::Error for ChecksumError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
None
}
}
pub trait Checksum {
fn reset(&mut self, order: EndianOrder) -> Result<(), ChecksumError>;
fn update(&mut self, data: &[u8]) -> Result<(), ChecksumError>;
fn finalize(&mut self) -> Result<[u64; 4], ChecksumError>;
fn hash(&mut self, data: &[u8], order: EndianOrder) -> Result<[u64; 4], ChecksumError>;
}