use super::{
meta_data::VerificationMetaDataList, setup::get_verifications as get_verifications_setup,
tally::get_verifications as get_verifications_tally, verifications::Verification,
VerificationCategory, VerificationError, VerificationErrorImpl, VerificationPeriod,
};
use crate::{config::VerifierConfig, file_structure::VerificationDirectory};
pub struct VerificationSuite<'a> {
period: VerificationPeriod,
list: VerificationList<'a>,
exclusion: Vec<String>,
}
pub struct VerificationList<'a>(pub Vec<Verification<'a, VerificationDirectory>>);
impl<'a> VerificationSuite<'a> {
pub fn new(
period: &VerificationPeriod,
metadata_list: &'a VerificationMetaDataList,
exclusion: &[String],
config: &'static VerifierConfig,
) -> Result<VerificationSuite<'a>, VerificationError> {
let all_verifs =
match period {
VerificationPeriod::Setup => get_verifications_setup(metadata_list, config)
.map_err(|e| VerificationErrorImpl::GetPeriod {
period: VerificationPeriod::Setup,
source: Box::new(e),
})?,
VerificationPeriod::Tally => get_verifications_tally(metadata_list, config)
.map_err(|e| VerificationErrorImpl::GetPeriod {
period: VerificationPeriod::Tally,
source: Box::new(e),
})?,
};
let all_ids: Vec<String> = all_verifs.0.iter().map(|v| v.id().to_string()).collect();
let verifs = all_verifs
.0
.into_iter()
.filter(|v| !exclusion.contains(&v.id().to_string()))
.collect::<Vec<_>>();
let mut excl: Vec<String> = exclusion.iter().map(|s| s.to_string()).collect();
excl.retain(|s| all_ids.contains(s));
Ok(VerificationSuite {
period: *period,
list: VerificationList(verifs),
exclusion: excl,
})
}
pub fn period(&self) -> &VerificationPeriod {
&self.period
}
pub fn verifications(&'a self) -> &'a VerificationList<'a> {
&self.list
}
pub fn verifications_mut(&'a mut self) -> &'a mut VerificationList<'a> {
&mut self.list
}
pub fn len(&self) -> usize {
self.list.0.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn exclusion(&self) -> &[String] {
&self.exclusion
}
pub fn len_excluded(&self) -> usize {
self.exclusion.len()
}
pub fn get_verifications_for_category(
&self,
category: VerificationCategory,
) -> Vec<&Verification<'a, VerificationDirectory>> {
self.list
.0
.iter()
.filter(|e| e.meta_data().category() == &category)
.collect()
}
pub fn collect_id(&self) -> Vec<&str> {
let mut list: Vec<&str> = self.list.0.iter().map(|v| v.id()).collect();
list.sort();
list
}
pub fn find_by_id(&self, id: &str) -> Option<&Verification<'a, VerificationDirectory>> {
self.list.0.iter().find(|&v| v.meta_data().id() == id)
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::{config::test::CONFIG_TEST, verification::meta_data::VerificationMetaData};
#[test]
fn test_setup_verifications() {
let metadata_list =
VerificationMetaDataList::load(CONFIG_TEST.get_verification_list_str()).unwrap();
let r_verifs = VerificationSuite::new(
&VerificationPeriod::Setup,
&metadata_list,
&[],
&CONFIG_TEST,
);
if r_verifs.is_err() {
let err = r_verifs.as_ref().err().unwrap();
println!("{err:?}")
}
assert!(r_verifs.is_ok(), "{:?}", r_verifs.as_ref().err());
let verifs = r_verifs.unwrap();
let setup: Vec<VerificationMetaData> = metadata_list
.iter()
.filter(|v| v.period() == &VerificationPeriod::Setup)
.cloned()
.collect();
assert_eq!(verifs.len(), setup.len());
let verif_ids = verifs.collect_id();
let metadata_ids: Vec<&str> = setup.iter().map(|v| v.id()).collect();
assert_eq!(verif_ids, metadata_ids)
}
#[test]
fn test_tally_verifications() {
let metadata_list =
VerificationMetaDataList::load(CONFIG_TEST.get_verification_list_str()).unwrap();
let r_verifs = VerificationSuite::new(
&VerificationPeriod::Tally,
&metadata_list,
&[],
&CONFIG_TEST,
);
if r_verifs.is_err() {
let err = r_verifs.as_ref().err().unwrap();
println!("{err:?}")
}
assert!(r_verifs.is_ok());
let verifs = r_verifs.unwrap();
let tally: Vec<VerificationMetaData> = metadata_list
.iter()
.filter(|v| v.period() == &VerificationPeriod::Tally)
.cloned()
.collect();
assert_eq!(verifs.len(), tally.len());
let verif_ids = verifs.collect_id();
let metadata_ids: Vec<&str> = tally.iter().map(|v| v.id()).collect();
assert_eq!(verif_ids, metadata_ids)
}
#[test]
fn test_with_exclusion() {
}
}