use serde::{Deserialize, Serialize};
use crate::error::DomainError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct CeremonyRevision(u64);
impl CeremonyRevision {
pub const INITIAL: Self = Self(1);
pub fn new(value: u64) -> Result<Self, DomainError> {
if value == 0 {
return Err(DomainError::MustBeNonZero {
field: "ceremony_revision",
});
}
Ok(Self(value))
}
#[must_use]
pub fn value(self) -> u64 {
self.0
}
#[must_use]
pub fn next(self) -> Self {
Self(self.0.saturating_add(1))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_stored_ceremony_is_at_least_at_the_initial_revision() {
assert_eq!(CeremonyRevision::INITIAL.value(), 1);
assert!(CeremonyRevision::new(0).is_err());
}
#[test]
fn revisions_advance_by_one() {
assert_eq!(CeremonyRevision::INITIAL.next().value(), 2);
}
}