use std::marker::PhantomData;
use anyhow::Error;
use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
use sha2::Digest;
use crate::zk::{ValidityCondition, ValidityConditionChecker};
#[derive(
Debug, BorshDeserialize, BorshSerialize, Serialize, Deserialize, PartialEq, Clone, Copy, Eq,
)]
pub struct MockValidityCond {
pub is_valid: bool,
}
impl Default for MockValidityCond {
fn default() -> Self {
Self { is_valid: true }
}
}
impl ValidityCondition for MockValidityCond {
type Error = Error;
fn combine<H: Digest>(&self, rhs: Self) -> Result<Self, Self::Error> {
Ok(MockValidityCond {
is_valid: self.is_valid & rhs.is_valid,
})
}
}
#[derive(BorshDeserialize, BorshSerialize, Debug)]
pub struct MockValidityCondChecker<Cond: ValidityCondition> {
phantom: PhantomData<Cond>,
}
impl ValidityConditionChecker<MockValidityCond> for MockValidityCondChecker<MockValidityCond> {
type Error = Error;
fn check(&mut self, condition: &MockValidityCond) -> Result<(), Self::Error> {
if condition.is_valid {
Ok(())
} else {
Err(anyhow::format_err!("Invalid mock validity condition"))
}
}
}
impl<Cond: ValidityCondition> MockValidityCondChecker<Cond> {
pub fn new() -> Self {
Self {
phantom: Default::default(),
}
}
}
impl<Cond: ValidityCondition> Default for MockValidityCondChecker<Cond> {
fn default() -> Self {
Self::new()
}
}