use sha2::{Digest, Sha256};
use crate::*;
pub type Checksum = Vec<u8>;
#[cfg_attr(docsrs, doc(cfg(feature = "encode")))]
#[derive(Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EncodedReplica {
protocol_version: ProtocolVersion,
checksum: Checksum,
bytes: Vec<u8>,
}
impl EncodedReplica {
#[inline]
pub(crate) fn bytes(&self) -> &[u8] {
self.bytes.as_slice()
}
#[inline]
pub(crate) fn checksum(&self) -> &Checksum {
&self.checksum
}
#[inline]
pub(crate) fn new(
protocol_version: ProtocolVersion,
checksum: Checksum,
bytes: Vec<u8>,
) -> Self {
Self { protocol_version, checksum, bytes }
}
#[inline]
pub(crate) fn protocol_version(&self) -> ProtocolVersion {
self.protocol_version
}
}
#[cfg_attr(docsrs, doc(cfg(feature = "encode")))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DecodeError {
ChecksumFailed,
DifferentProtocol {
encoded_on: ProtocolVersion,
decoding_on: ProtocolVersion,
},
InvalidData,
}
#[inline]
pub fn checksum(bytes: &[u8]) -> Checksum {
Sha256::digest(bytes)[..].to_vec()
}