use sha2::{Digest, Sha256};
pub(crate) struct ClaimDigest {
hasher: Sha256,
}
impl ClaimDigest {
pub(crate) fn new() -> Self {
Self {
hasher: Sha256::new(),
}
}
pub(crate) fn field(&mut self, bytes: &[u8]) {
self.hasher.update((bytes.len() as u64).to_le_bytes());
self.hasher.update(bytes);
}
pub(crate) fn text(&mut self, text: &str) {
self.field(text.as_bytes());
}
pub(crate) fn count(&mut self, elements: usize) {
self.field(&(elements as u64).to_le_bytes());
}
pub(crate) fn optional_text(&mut self, text: Option<&str>) {
match text {
None => self.field(&[0]),
Some(held) => {
self.field(&[1]);
self.text(held);
}
}
}
pub(crate) fn finish(self) -> [u8; 32] {
self.hasher.finalize().into()
}
}