validator: remove explicit StringEmptyCheck newtype

This commit is contained in:
Quaternions 2025-04-11 23:20:48 -07:00
parent c4f910c1f0
commit 9331f37d70
Signed by: Quaternions
GPG Key ID: D0DF5964F79AC131

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