diff --git a/SchemaValidator/SchemaValidator.cs b/SchemaValidator/SchemaValidator.cs index 1499b6f..3b518ce 100644 --- a/SchemaValidator/SchemaValidator.cs +++ b/SchemaValidator/SchemaValidator.cs @@ -36,6 +36,7 @@ public class SchemaValidator new ColumnCountValidator(gameData), new IconTypeValidator(gameData), new NamedInnerNamedOuterValidator(gameData), + new FieldNameValidator(gameData), new ModelIdTypeValidator(gameData), new ColorTypeValidator(gameData), new IconPathExistsValidator(gameData), diff --git a/SchemaValidator/Validation/Validators/FieldNameValidator.cs b/SchemaValidator/Validation/Validators/FieldNameValidator.cs new file mode 100644 index 0000000..98cfaac --- /dev/null +++ b/SchemaValidator/Validation/Validators/FieldNameValidator.cs @@ -0,0 +1,43 @@ +using System.Text.RegularExpressions; +using Lumina; +using Lumina.Data.Files.Excel; +using SchemaValidator.New; +using SchemaValidator.Util; + +namespace SchemaValidator.Validation.Validators; + +public partial class FieldNameValidator : Validator +{ + public override string ValidatorName() => "FieldNameValidator"; + private string _sheetName = ""; + + [GeneratedRegex("^[a-zA-Z_][a-zA-Z0-9_]*$", RegexOptions.Compiled)] + private static partial Regex _nameRegex(); + + public override ValidationResults Validate(ExcelHeaderFile exh, Sheet sheet) + { + _sheetName = sheet.Name; + + // I just don't have the brainpower to recurse right now + var flat = SchemaUtil.Flatten(exh, sheet); + + var results = new ValidationResults(); + foreach (var fieldName in flat.Select(d => d.Field.Name).Distinct()) + { + if (string.IsNullOrEmpty(fieldName)) + { + results.Add(ValidationResult.Error(_sheetName, ValidatorName(), "Field name is empty.")); + continue; + } + + if (!_nameRegex().IsMatch(fieldName)) + results.Results.Add(ValidationResult.Error(_sheetName, ValidatorName(), $"Field name {fieldName} is not a valid name.")); + } + + if (results.Results.Count == 0) + return ValidationResults.Success(sheet.Name, ValidatorName()); + return results; + } + + public FieldNameValidator(GameData gameData) : base(gameData) { } +} \ No newline at end of file