diff --git a/validation/src/check.rs b/validation/src/check.rs index 5c5c3de..402cce2 100644 --- a/validation/src/check.rs +++ b/validation/src/check.rs @@ -169,7 +169,7 @@ pub fn get_model_info(dom:&rbx_dom_weak::WeakDom)->Result<ModelInfo,GetRootInsta }) } -// check if an observed string matches and expected string +// check if an observed string matches an expected string pub struct StringCheck<'a,T,Str>(Result<T,StringCheckContext<'a,Str>>); pub struct StringCheckContext<'a,Str>{ observed:&'a str, @@ -219,13 +219,13 @@ impl<ID> DuplicateCheckContext<ID>{ } } -// check that there is at least one -pub struct AtLeastOneMatchingAndNoExtraCheckContext<ID>{ +// check that there is at least one matching item for each item in a reference set, and no extra items +pub struct SetDifferenceCheckContext<ID>{ extra:HashMap<ID,u64>, missing:HashSet<ID>, } -pub struct AtLeastOneMatchingAndNoExtraCheck<ID>(Result<(),AtLeastOneMatchingAndNoExtraCheckContext<ID>>); -impl<ID> AtLeastOneMatchingAndNoExtraCheckContext<ID>{ +pub struct SetDifferenceCheck<ID>(Result<(),SetDifferenceCheckContext<ID>>); +impl<ID> SetDifferenceCheckContext<ID>{ fn new(initial_set:HashMap<ID,u64>)->Self{ Self{ extra:initial_set, @@ -233,8 +233,8 @@ impl<ID> AtLeastOneMatchingAndNoExtraCheckContext<ID>{ } } } -impl<ID:Copy+Eq+std::hash::Hash> AtLeastOneMatchingAndNoExtraCheckContext<ID>{ - fn check<T>(self,reference_set:&HashMap<ID,T>)->AtLeastOneMatchingAndNoExtraCheck<ID>{ +impl<ID:Copy+Eq+std::hash::Hash> SetDifferenceCheckContext<ID>{ + fn check<T>(self,reference_set:&HashMap<ID,T>)->SetDifferenceCheck<ID>{ let Self{mut extra,mut missing}=self; // remove correct entries for (id,_) in reference_set{ @@ -245,9 +245,9 @@ impl<ID:Copy+Eq+std::hash::Hash> AtLeastOneMatchingAndNoExtraCheckContext<ID>{ } // if any entries remain, they are incorrect if extra.is_empty()&&missing.is_empty(){ - AtLeastOneMatchingAndNoExtraCheck(Ok(())) + SetDifferenceCheck(Ok(())) }else{ - AtLeastOneMatchingAndNoExtraCheck(Err(Self{extra,missing})) + SetDifferenceCheck(Err(Self{extra,missing})) } } } @@ -281,7 +281,7 @@ pub struct MapCheck<'a>{ // No duplicate map starts (including bonuses) mode_start_counts:DuplicateCheck<ModeID>, // At least one finish zone for each start zone, and no finishes with no start - mode_finish_counts:AtLeastOneMatchingAndNoExtraCheck<ModeID>, + mode_finish_counts:SetDifferenceCheck<ModeID>, // Spawn1 must exist spawn1:Result<(),()>, // No duplicate Spawn# @@ -341,7 +341,7 @@ impl<'a> ModelInfo<'a>{ }; // check that at least one end zone exists for each start zone. - let mode_finish_counts=AtLeastOneMatchingAndNoExtraCheckContext::new(self.counts.mode_finish_counts) + let mode_finish_counts=SetDifferenceCheckContext::new(self.counts.mode_finish_counts) .check(&self.counts.mode_start_counts); // there must be exactly one start zone for every mode in the map. @@ -380,7 +380,7 @@ impl<'a> MapCheck<'a>{ game_id:Ok(game_id), mapstart:Ok(()), mode_start_counts:DuplicateCheck(Ok(())), - mode_finish_counts:AtLeastOneMatchingAndNoExtraCheck(Ok(())), + mode_finish_counts:SetDifferenceCheck(Ok(())), spawn1:Ok(()), spawn_counts:DuplicateCheck(Ok(())), wormhole_out_counts:DuplicateCheck(Ok(())), @@ -448,7 +448,7 @@ impl<'a> std::fmt::Display for MapCheck<'a>{ })?; writeln!(f,"")?; } - if let AtLeastOneMatchingAndNoExtraCheck(Err(context))=&self.mode_finish_counts{ + if let SetDifferenceCheck(Err(context))=&self.mode_finish_counts{ // perhaps there are extra end zones (context.extra) if !context.extra.is_empty(){ write!(f,"Extra finish zones with no matching start zone: ")?;