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
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")?,