use std::fmt::Debug;
mod sealed {
pub trait Sealed {}
}
pub trait ProofState: sealed::Sealed + Clone + Debug + Default {}
#[derive(Clone, Debug, Default)]
pub struct Pending;
#[derive(Clone, Debug, Default)]
pub struct Verified;
#[derive(Clone, Debug, Default)]
pub struct Batched;
#[derive(Clone, Debug, Default)]
pub struct Aggregated;
impl sealed::Sealed for Pending {}
impl sealed::Sealed for Verified {}
impl sealed::Sealed for Batched {}
impl sealed::Sealed for Aggregated {}
impl ProofState for Pending {}
impl ProofState for Verified {}
impl ProofState for Batched {}
impl ProofState for Aggregated {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn states_are_zero_sized() {
assert_eq!(std::mem::size_of::<Pending>(), 0);
assert_eq!(std::mem::size_of::<Verified>(), 0);
assert_eq!(std::mem::size_of::<Batched>(), 0);
assert_eq!(std::mem::size_of::<Aggregated>(), 0);
}
#[test]
fn states_implement_required_traits() {
let p = Pending;
let _p2 = p.clone();
let v = Verified;
let _ = format!("{:?}", v);
let _b: Batched = Default::default();
}
#[test]
fn states_are_distinct_types() {
fn takes_pending(_: Pending) {}
fn takes_verified(_: Verified) {}
takes_pending(Pending);
takes_verified(Verified);
}
}