use crate::ValidationError;
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct Digest([u8; Self::LEN]);
impl Digest {
pub const LEN: usize = 32;
#[must_use]
pub const fn new(bytes: [u8; Self::LEN]) -> Self {
Self(bytes)
}
#[must_use]
pub const fn as_bytes(&self) -> &[u8; Self::LEN] {
&self.0
}
#[must_use]
pub const fn is_zero(&self) -> bool {
let mut accumulated = 0;
let mut index = 0;
while index < Self::LEN {
accumulated |= self.0[index];
index += 1;
}
accumulated == 0
}
#[must_use]
pub const fn ct_eq(&self, other: &Self) -> bool {
let mut accumulated = 0;
let mut index = 0;
while index < Self::LEN {
accumulated |= self.0[index] ^ other.0[index];
index += 1;
}
accumulated == 0
}
}
impl core::fmt::Debug for Digest {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str("Digest(..)")
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct EventId(Digest);
impl EventId {
pub const fn new(digest: Digest) -> Result<Self, ValidationError> {
if digest.is_zero() {
Err(ValidationError::ZeroValue)
} else {
Ok(Self(digest))
}
}
#[must_use]
pub const fn digest(&self) -> Digest {
self.0
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct CapabilityRef(Digest);
impl CapabilityRef {
pub const fn new(digest: Digest) -> Result<Self, ValidationError> {
if digest.is_zero() {
Err(ValidationError::ZeroValue)
} else {
Ok(Self(digest))
}
}
#[must_use]
pub const fn digest(&self) -> Digest {
self.0
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct PolicyEpoch(Digest);
impl PolicyEpoch {
pub const fn new(digest: Digest) -> Result<Self, ValidationError> {
if digest.is_zero() {
Err(ValidationError::ZeroValue)
} else {
Ok(Self(digest))
}
}
#[must_use]
pub const fn digest(&self) -> Digest {
self.0
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct OperationSequence(u64);
impl OperationSequence {
pub const fn new(value: u64) -> Result<Self, ValidationError> {
if value == 0 {
Err(ValidationError::ZeroValue)
} else {
Ok(Self(value))
}
}
#[must_use]
pub const fn get(self) -> u64 {
self.0
}
}
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct Nonce([u8; Self::LEN]);
impl Nonce {
pub const LEN: usize = 16;
#[must_use]
pub const fn new(bytes: [u8; Self::LEN]) -> Self {
Self(bytes)
}
#[must_use]
pub const fn as_bytes(&self) -> &[u8; Self::LEN] {
&self.0
}
}
impl core::fmt::Debug for Nonce {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str("Nonce(..)")
}
}