use crate::rules::validation::{Validation, VotingValidation};
use odra::contract_env::revert;
use odra::prelude::{boxed::Box, vec::Vec};
mod builder;
pub mod validation;
use crate::configuration::Configuration;
use crate::voting::voting_engine::voting_state_machine::VotingStateMachine;
pub use builder::RulesBuilder;
pub struct Rules {
validations: Vec<Box<dyn Validation>>,
voting_validations: Vec<Box<dyn VotingValidation>>,
}
impl Rules {
pub fn validate_generic_validations(&self) {
for validation in &self.validations {
if let Err(error) = validation.validate() {
revert(error)
}
}
}
pub fn validate_voting_validations(
&self,
voting_state_machine: &VotingStateMachine,
configuration: &Configuration,
) {
for validation in &self.voting_validations {
if let Err(error) = validation.validate(voting_state_machine, configuration) {
revert(error)
}
}
}
pub fn validate(
&self,
voting_state_machine: &VotingStateMachine,
configuration: &Configuration,
) {
self.validate_generic_validations();
self.validate_voting_validations(voting_state_machine, configuration);
}
}