diff --git a/validation/src/check.rs b/validation/src/check.rs index e8d337f..1f957b4 100644 --- a/validation/src/check.rs +++ b/validation/src/check.rs @@ -177,21 +177,13 @@ impl<'a,Str:std::fmt::Display> std::fmt::Display for StringCheckContext<'a,Str>{ // check if a string is empty pub struct StringEmpty; -pub struct StringEmptyCheck<Context>(Result<Context,StringEmpty>); -impl<Context> StringEmptyCheck<Context>{ - fn map<T>(self,f:impl Fn(Context)->T)->StringEmptyCheck<T>{ - StringEmptyCheck(self.0.map(f)) - } -} impl std::fmt::Display for StringEmpty{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ write!(f,"Empty string") } } -impl<'a> StringEmptyCheck<&'a str>{ - fn new(value:&'a str)->StringEmptyCheck<&'a str>{ - StringEmptyCheck(value.is_empty().then_some(value).ok_or(StringEmpty)) - } +fn check_empty(value:&str)->Result<&str,StringEmpty>{ + value.is_empty().then_some(value).ok_or(StringEmpty) } // check for duplicate objects @@ -282,10 +274,10 @@ pub struct MapCheck<'a>{ model_name:StringCheck<'a,(),String>, // Map must have a StringValue named DisplayName. // Value must not be empty, must be in title case. - display_name:Result<StringEmptyCheck<StringCheck<'a,&'a str,String>>,StringValueError>, + display_name:Result<Result<StringCheck<'a,&'a str,String>,StringEmpty>,StringValueError>, // Map must have a StringValue named Creator. // Value must not be empty. - creator:Result<StringEmptyCheck<&'a str>,StringValueError>, + creator:Result<Result<&'a str,StringEmpty>,StringValueError>, // The prefix of the model's name must match the game it was submitted for. // bhop_ for bhop, and surf_ for surf game_id:Result<GameID,ParseGameIDError>, @@ -323,14 +315,14 @@ impl<'a> ModelInfo<'a>{ // Check display name is not empty and has title case let display_name=self.map_info.display_name.map(|display_name|{ - StringEmptyCheck::new(display_name).map(|display_name|StringCheckContext{ + check_empty(display_name).map(|display_name|StringCheckContext{ observed:display_name, expected:display_name.to_title_case(), }.check(display_name)) }); // Check Creator is not empty - let creator=self.map_info.creator.map(StringEmptyCheck::new); + let creator=self.map_info.creator.map(check_empty); // Check GameID (model name was prefixed with bhop_ surf_ etc) let game_id=self.map_info.game_id; @@ -391,8 +383,8 @@ impl<'a> MapCheck<'a>{ MapCheck{ model_class:StringCheck(Ok(())), model_name:StringCheck(Ok(())), - display_name:Ok(StringEmptyCheck(Ok(StringCheck(Ok(display_name))))), - creator:Ok(StringEmptyCheck(Ok(creator))), + display_name:Ok(Ok(StringCheck(Ok(display_name)))), + creator:Ok(Ok(creator)), game_id:Ok(game_id), mapstart:Ok(()), mode_start_counts:DuplicateCheck(Ok(())), @@ -446,16 +438,16 @@ impl<'a> std::fmt::Display for MapCheck<'a>{ writeln!(f,"Invalid Model Name: {context}")?; } match &self.display_name{ - Ok(StringEmptyCheck(Ok(StringCheck(Ok(_)))))=>(), - Ok(StringEmptyCheck(Ok(StringCheck(Err(context)))))=>writeln!(f,"Invalid DisplayName: {context}")?, - Ok(StringEmptyCheck(Err(context)))=>writeln!(f,"Invalid DisplayName: {context}")?, + Ok(Ok(StringCheck(Ok(_))))=>(), + Ok(Ok(StringCheck(Err(context))))=>writeln!(f,"Invalid DisplayName: {context}")?, + Ok(Err(context))=>writeln!(f,"Invalid DisplayName: {context}")?, Err(StringValueError::ObjectNotFound)=>writeln!(f,"Missing DisplayName StringValue")?, Err(StringValueError::ValueNotSet)=>writeln!(f,"DisplayName Value not set")?, Err(StringValueError::NonStringValue)=>writeln!(f,"DisplayName Value is not a String")?, } match &self.creator{ - Ok(StringEmptyCheck(Ok(_)))=>(), - Ok(StringEmptyCheck(Err(context)))=>writeln!(f,"Invalid Creator: {context}")?, + Ok(Ok(_))=>(), + Ok(Err(context))=>writeln!(f,"Invalid Creator: {context}")?, Err(StringValueError::ObjectNotFound)=>writeln!(f,"Missing Creator StringValue")?, Err(StringValueError::ValueNotSet)=>writeln!(f,"Creator Value not set")?, Err(StringValueError::NonStringValue)=>writeln!(f,"Creator Value is not a String")?,