From 90cea6ffea2115a2642ed753cecb5fb74b449256 Mon Sep 17 00:00:00 2001 From: Leo Cavalcante Date: Tue, 29 Sep 2026 18:04:33 -0300 Subject: [PATCH] Call strings.EqualFold from generated validators. types.EqualFold only forwarded to the standard library. --- docs/internals.md | 6 +-- internal/codegenerator/condition_table.go | 8 +-- ...generated_function_code_no_pointer_test.go | 4 +- .../generated_function_code_pointer_test.go | 4 +- ...nerated_validation_code_no_pointer_test.go | 4 +- .../generated_validation_code_pointer_test.go | 4 +- .../get_test_elements_all_types_test.go | 8 +-- .../get_test_elements_pointer_test.go | 4 +- .../get_test_elements_string_test.go | 4 +- internal/pkgwriter/file_validator.go | 23 ++++++++- internal/pkgwriter/file_validator_test.go | 51 +++++++++++++++++++ tests/cmpbenchtests/validator__.go | 10 ++-- tests/endtoend/validator__.go | 10 ++-- types/string_utils.go | 5 -- 14 files changed, 107 insertions(+), 38 deletions(-) diff --git a/docs/internals.md b/docs/internals.md index b5c896e..58c142d 100644 --- a/docs/internals.md +++ b/docs/internals.md @@ -28,7 +28,7 @@ TestGen is a separate program under `testgen/`. It is described at the end. `internal/common` holds the shared `FieldType`, the normalized type names, `KeyPath`, and `CountValues`. -`types` is the package generated validators import, `github.com/opencodeco/validgen/types`. It defines `ValidationError` and the helpers the condition table calls, including `IsValidEmail`, `EqualFold`, `SliceOnlyContains`, `SliceNotContains`, `MapOnlyContains`, and `MapNotContains`. +`types` is the package generated validators import, `github.com/opencodeco/validgen/types`. It defines `ValidationError` and the helpers the condition table calls, including `IsValidEmail`, `SliceOnlyContains`, `SliceNotContains`, `MapOnlyContains`, and `MapNotContains`. Case-insensitive string checks call `strings.EqualFold` directly. ## Parser @@ -142,11 +142,11 @@ errs = append(errs, types.NewValidationError("message")) Scalar `in` rows set `concatOperator` to `||`, and the per-value copies are joined. That includes `*`, `*`, `*`, and `*`. Scalar `nin` rows set `concatOperator` to `&&`. Slice, array, and map rows leave `concatOperator` empty, so `DefineTestElements` keeps one copy. That copy lists every target through `{{.TargetsAsStringSlice}}` or `{{.TargetsAsNumericSlice}}`. -Those slice and map copies call `types.SliceOnlyContains`, `types.SliceNotContains`, `types.MapOnlyContains`, or `types.MapNotContains`. Non-pointer array rows pass `obj.Field[:]` into the slice helpers. Literal string comparisons quote the target. `email` calls `types.IsValidEmail`. `eq_ignore_case` and `neq_ignore_case` call `types.EqualFold`. Field comparisons compile to `obj.Field` compared with `obj.Other` or `obj.Nested.Field`. +Those slice and map copies call `types.SliceOnlyContains`, `types.SliceNotContains`, `types.MapOnlyContains`, or `types.MapNotContains`. Non-pointer array rows pass `obj.Field[:]` into the slice helpers. Literal string comparisons quote the target. `email` calls `types.IsValidEmail`. `eq_ignore_case` and `neq_ignore_case` call `strings.EqualFold`. Field comparisons compile to `obj.Field` compared with `obj.Other` or `obj.Nested.Field`. When `IsGoType` is false, each validation on that field appends a nested call instead of a condition-table test. The call is `TypeValidate(&obj.Field)`, where `Type` is `BaseType`. If `BaseType` starts with the struct's own package name and a dot, that prefix is removed. A same-package field whose `BaseType` is `main.InnerStructType` calls `InnerStructTypeValidate`. A field whose `BaseType` is `mypkg.InnerStructType` calls `mypkg.InnerStructTypeValidate`. The call is emitted when `BaseType` is in the parsed-struct index. A missing type returns `no validator found for struct type`. -Imports kept on the generated package are the struct file's imports whose local name is a package name parsed in this run. `buildImportPath` writes each of those paths as a quoted import and always adds `github.com/opencodeco/validgen/types`. When any struct in the package has `UnmarshalJSON` source, it also adds `encoding/json` and `errors`. +Imports kept on the generated package are the struct file's imports whose local name is a package name parsed in this run. `buildImportPath` writes each of those paths as a quoted import and always adds `github.com/opencodeco/validgen/types`. When any struct in the package has `UnmarshalJSON` source, it also adds `encoding/json` and `errors`. When generated code calls `strings.EqualFold`, it also adds `strings`. ## Package writer diff --git a/internal/codegenerator/condition_table.go b/internal/codegenerator/condition_table.go index d694973..0c5fed5 100644 --- a/internal/codegenerator/condition_table.go +++ b/internal/codegenerator/condition_table.go @@ -296,7 +296,7 @@ var conditionTable = map[string]Operation{ { AcceptedTypes: []string{""}, ConditionTable: ConditionTable{ - operation: `types.EqualFold(obj.{{.Name}}, "{{.Target}}")`, + operation: `strings.EqualFold(obj.{{.Name}}, "{{.Target}}")`, concatOperator: "", errorMessage: "{{.Name}} must be equal to '{{.Target}}'", }, @@ -304,7 +304,7 @@ var conditionTable = map[string]Operation{ { AcceptedTypes: []string{"*"}, ConditionTable: ConditionTable{ - operation: `obj.{{.Name}} != nil && types.EqualFold(*obj.{{.Name}}, "{{.Target}}")`, + operation: `obj.{{.Name}} != nil && strings.EqualFold(*obj.{{.Name}}, "{{.Target}}")`, concatOperator: "", errorMessage: "{{.Name}} must be equal to '{{.Target}}'", }, @@ -388,7 +388,7 @@ var conditionTable = map[string]Operation{ { AcceptedTypes: []string{""}, ConditionTable: ConditionTable{ - operation: `!types.EqualFold(obj.{{.Name}}, "{{.Target}}")`, + operation: `!strings.EqualFold(obj.{{.Name}}, "{{.Target}}")`, concatOperator: "", errorMessage: "{{.Name}} must not be equal to '{{.Target}}'", }, @@ -396,7 +396,7 @@ var conditionTable = map[string]Operation{ { AcceptedTypes: []string{"*"}, ConditionTable: ConditionTable{ - operation: `obj.{{.Name}} != nil && !types.EqualFold(*obj.{{.Name}}, "{{.Target}}")`, + operation: `obj.{{.Name}} != nil && !strings.EqualFold(*obj.{{.Name}}, "{{.Target}}")`, concatOperator: "", errorMessage: "{{.Name}} must not be equal to '{{.Target}}'", }, diff --git a/internal/codegenerator/generated_function_code_no_pointer_test.go b/internal/codegenerator/generated_function_code_no_pointer_test.go index 2cd601d..60daf53 100644 --- a/internal/codegenerator/generated_function_code_no_pointer_test.go +++ b/internal/codegenerator/generated_function_code_no_pointer_test.go @@ -2522,7 +2522,7 @@ return errs }, want: `func eq_ignore_caseStructValidate(obj *eq_ignore_caseStruct) []error { var errs []error -if !(types.EqualFold(obj.FieldEq_ignore_caseString, "abcde")) { +if !(strings.EqualFold(obj.FieldEq_ignore_caseString, "abcde")) { errs = append(errs, types.NewValidationError("FieldEq_ignore_caseString must be equal to 'abcde'")) } return errs @@ -2553,7 +2553,7 @@ return errs }, want: `func neq_ignore_caseStructValidate(obj *neq_ignore_caseStruct) []error { var errs []error -if !(!types.EqualFold(obj.FieldNeq_ignore_caseString, "abcde")) { +if !(!strings.EqualFold(obj.FieldNeq_ignore_caseString, "abcde")) { errs = append(errs, types.NewValidationError("FieldNeq_ignore_caseString must not be equal to 'abcde'")) } return errs diff --git a/internal/codegenerator/generated_function_code_pointer_test.go b/internal/codegenerator/generated_function_code_pointer_test.go index 2288eb6..36fa44e 100644 --- a/internal/codegenerator/generated_function_code_pointer_test.go +++ b/internal/codegenerator/generated_function_code_pointer_test.go @@ -2704,7 +2704,7 @@ return errs }, want: `func eq_ignore_caseStructValidate(obj *eq_ignore_caseStruct) []error { var errs []error -if !(obj.FieldEq_ignore_caseStringPointer != nil && types.EqualFold(*obj.FieldEq_ignore_caseStringPointer, "abcde")) { +if !(obj.FieldEq_ignore_caseStringPointer != nil && strings.EqualFold(*obj.FieldEq_ignore_caseStringPointer, "abcde")) { errs = append(errs, types.NewValidationError("FieldEq_ignore_caseStringPointer must be equal to 'abcde'")) } return errs @@ -2735,7 +2735,7 @@ return errs }, want: `func neq_ignore_caseStructValidate(obj *neq_ignore_caseStruct) []error { var errs []error -if !(obj.FieldNeq_ignore_caseStringPointer != nil && !types.EqualFold(*obj.FieldNeq_ignore_caseStringPointer, "abcde")) { +if !(obj.FieldNeq_ignore_caseStringPointer != nil && !strings.EqualFold(*obj.FieldNeq_ignore_caseStringPointer, "abcde")) { errs = append(errs, types.NewValidationError("FieldNeq_ignore_caseStringPointer must not be equal to 'abcde'")) } return errs diff --git a/internal/codegenerator/generated_validation_code_no_pointer_test.go b/internal/codegenerator/generated_validation_code_no_pointer_test.go index 7920045..b4e1407 100644 --- a/internal/codegenerator/generated_validation_code_no_pointer_test.go +++ b/internal/codegenerator/generated_validation_code_no_pointer_test.go @@ -2151,7 +2151,7 @@ errs = append(errs, types.NewValidationError("FieldMaxBoolMap must have at most fieldType: common.FieldType{ComposedType: "", BaseType: "string", Size: ""}, fieldValidation: "eq_ignore_case=abcde", }, - want: `if !(types.EqualFold(obj.FieldEq_ignore_caseString, "abcde")) { + want: `if !(strings.EqualFold(obj.FieldEq_ignore_caseString, "abcde")) { errs = append(errs, types.NewValidationError("FieldEq_ignore_caseString must be equal to 'abcde'")) } `, @@ -2163,7 +2163,7 @@ errs = append(errs, types.NewValidationError("FieldEq_ignore_caseString must be fieldType: common.FieldType{ComposedType: "", BaseType: "string", Size: ""}, fieldValidation: "neq_ignore_case=abcde", }, - want: `if !(!types.EqualFold(obj.FieldNeq_ignore_caseString, "abcde")) { + want: `if !(!strings.EqualFold(obj.FieldNeq_ignore_caseString, "abcde")) { errs = append(errs, types.NewValidationError("FieldNeq_ignore_caseString must not be equal to 'abcde'")) } `, diff --git a/internal/codegenerator/generated_validation_code_pointer_test.go b/internal/codegenerator/generated_validation_code_pointer_test.go index 6fa3895..d5ce998 100644 --- a/internal/codegenerator/generated_validation_code_pointer_test.go +++ b/internal/codegenerator/generated_validation_code_pointer_test.go @@ -2319,7 +2319,7 @@ errs = append(errs, types.NewValidationError("FieldMaxBoolMapPointer must have a fieldType: common.FieldType{ComposedType: "*", BaseType: "string", Size: ""}, fieldValidation: "eq_ignore_case=abcde", }, - want: `if !(obj.FieldEq_ignore_caseStringPointer != nil && types.EqualFold(*obj.FieldEq_ignore_caseStringPointer, "abcde")) { + want: `if !(obj.FieldEq_ignore_caseStringPointer != nil && strings.EqualFold(*obj.FieldEq_ignore_caseStringPointer, "abcde")) { errs = append(errs, types.NewValidationError("FieldEq_ignore_caseStringPointer must be equal to 'abcde'")) } `, @@ -2331,7 +2331,7 @@ errs = append(errs, types.NewValidationError("FieldEq_ignore_caseStringPointer m fieldType: common.FieldType{ComposedType: "*", BaseType: "string", Size: ""}, fieldValidation: "neq_ignore_case=abcde", }, - want: `if !(obj.FieldNeq_ignore_caseStringPointer != nil && !types.EqualFold(*obj.FieldNeq_ignore_caseStringPointer, "abcde")) { + want: `if !(obj.FieldNeq_ignore_caseStringPointer != nil && !strings.EqualFold(*obj.FieldNeq_ignore_caseStringPointer, "abcde")) { errs = append(errs, types.NewValidationError("FieldNeq_ignore_caseStringPointer must not be equal to 'abcde'")) } `, diff --git a/internal/codegenerator/get_test_elements_all_types_test.go b/internal/codegenerator/get_test_elements_all_types_test.go index ccb2982..3418d99 100644 --- a/internal/codegenerator/get_test_elements_all_types_test.go +++ b/internal/codegenerator/get_test_elements_all_types_test.go @@ -279,7 +279,7 @@ func TestDefineTestElementsWithAllTypes(t *testing.T) { types: []string{""}, value: "abc", want: TestElements{ - conditions: []string{`types.EqualFold(obj.field, "abc")`}, + conditions: []string{`strings.EqualFold(obj.field, "abc")`}, concatOperator: "", errorMessage: "field must be equal to 'abc'", }, @@ -288,7 +288,7 @@ func TestDefineTestElementsWithAllTypes(t *testing.T) { types: []string{"*"}, value: "abc", want: TestElements{ - conditions: []string{`obj.field != nil && types.EqualFold(*obj.field, "abc")`}, + conditions: []string{`obj.field != nil && strings.EqualFold(*obj.field, "abc")`}, concatOperator: "", errorMessage: "field must be equal to 'abc'", }, @@ -304,7 +304,7 @@ func TestDefineTestElementsWithAllTypes(t *testing.T) { types: []string{""}, value: "abc", want: TestElements{ - conditions: []string{`!types.EqualFold(obj.field, "abc")`}, + conditions: []string{`!strings.EqualFold(obj.field, "abc")`}, concatOperator: "", errorMessage: "field must not be equal to 'abc'", }, @@ -313,7 +313,7 @@ func TestDefineTestElementsWithAllTypes(t *testing.T) { types: []string{"*"}, value: "abc", want: TestElements{ - conditions: []string{`obj.field != nil && !types.EqualFold(*obj.field, "abc")`}, + conditions: []string{`obj.field != nil && !strings.EqualFold(*obj.field, "abc")`}, concatOperator: "", errorMessage: "field must not be equal to 'abc'", }, diff --git a/internal/codegenerator/get_test_elements_pointer_test.go b/internal/codegenerator/get_test_elements_pointer_test.go index 6ea6d1a..93b45b8 100644 --- a/internal/codegenerator/get_test_elements_pointer_test.go +++ b/internal/codegenerator/get_test_elements_pointer_test.go @@ -44,7 +44,7 @@ func TestDefineTestElementsWithStringPointerFields(t *testing.T) { { validation: "eq_ignore_case=AbC", want: TestElements{ - conditions: []string{`obj.Field != nil && types.EqualFold(*obj.Field, "AbC")`}, + conditions: []string{`obj.Field != nil && strings.EqualFold(*obj.Field, "AbC")`}, errorMessage: "Field must be equal to 'AbC'", }, }, @@ -65,7 +65,7 @@ func TestDefineTestElementsWithStringPointerFields(t *testing.T) { { validation: "neq_ignore_case=AbC", want: TestElements{ - conditions: []string{`obj.Field != nil && !types.EqualFold(*obj.Field, "AbC")`}, + conditions: []string{`obj.Field != nil && !strings.EqualFold(*obj.Field, "AbC")`}, errorMessage: "Field must not be equal to 'AbC'", }, }, diff --git a/internal/codegenerator/get_test_elements_string_test.go b/internal/codegenerator/get_test_elements_string_test.go index af81d6a..ff5bac9 100644 --- a/internal/codegenerator/get_test_elements_string_test.go +++ b/internal/codegenerator/get_test_elements_string_test.go @@ -68,7 +68,7 @@ func TestDefineTestElementsWithStringFields(t *testing.T) { fieldValidation: "eq_ignore_case=AbC", }, want: TestElements{ - conditions: []string{`types.EqualFold(obj.myStrField, "AbC")`}, + conditions: []string{`strings.EqualFold(obj.myStrField, "AbC")`}, errorMessage: "myStrField must be equal to 'AbC'", }, }, @@ -101,7 +101,7 @@ func TestDefineTestElementsWithStringFields(t *testing.T) { fieldValidation: "neq_ignore_case=AbC", }, want: TestElements{ - conditions: []string{`!types.EqualFold(obj.MyFieldNotEqual, "AbC")`}, + conditions: []string{`!strings.EqualFold(obj.MyFieldNotEqual, "AbC")`}, errorMessage: "MyFieldNotEqual must not be equal to 'AbC'", }, }, diff --git a/internal/pkgwriter/file_validator.go b/internal/pkgwriter/file_validator.go index f3bd3e2..b2d4773 100644 --- a/internal/pkgwriter/file_validator.go +++ b/internal/pkgwriter/file_validator.go @@ -5,6 +5,7 @@ import ( "fmt" "go/format" "os" + "strings" "text/template" "github.com/opencodeco/validgen/internal/codegenerator" @@ -44,10 +45,28 @@ func needsJSONUnmarshal(pkg *codegenerator.Pkg) bool { return false } +func codeUsesStringsEqualFold(pkg *codegenerator.Pkg) bool { + const needle = "strings.EqualFold" + for _, st := range pkg.Structs { + if strings.Contains(st.ValidatorFuncCode, needle) || strings.Contains(st.UnmarshalJSONCode, needle) { + return true + } + } + return false +} + func buildImportPath(pkg *codegenerator.Pkg) (string, error) { code := "" - if needsJSONUnmarshal(pkg) { - code += "\t\"encoding/json\"\n\t\"errors\"\n\n" + needsJSON := needsJSONUnmarshal(pkg) + needsStrings := codeUsesStringsEqualFold(pkg) + if needsJSON { + code += "\t\"encoding/json\"\n\t\"errors\"\n" + } + if needsStrings { + code += "\t\"strings\"\n" + } + if needsJSON || needsStrings { + code += "\n" } code += "\t\"github.com/opencodeco/validgen/types\"" diff --git a/internal/pkgwriter/file_validator_test.go b/internal/pkgwriter/file_validator_test.go index 225a3a1..4d72349 100644 --- a/internal/pkgwriter/file_validator_test.go +++ b/internal/pkgwriter/file_validator_test.go @@ -262,3 +262,54 @@ func (obj *User) UnmarshalJSON(b []byte) error { t.Errorf("BuildFileValidatorCode() diff =\n%s", dmp.DiffPrettyText(dmp.DiffMain(want, got, false))) } } + +func TestBuildFileValidatorImportsStringsForEqualFold(t *testing.T) { + got, err := BuildFileValidatorCode(&codegenerator.Pkg{ + Name: "main", + Structs: map[string]*codegenerator.Struct{ + "User": { + Struct: &analyzer.Struct{ + Struct: parser.Struct{ + PackageName: "main", + StructName: "User", + }, + }, + ValidatorFuncCode: ` +func UserValidate(obj *User) []error { +var errs []error +if !(strings.EqualFold(obj.Name, "abc")) { +errs = append(errs, types.NewValidationError("Name must be equal to 'abc'")) +} +return errs +}`, + }, + }, + }) + if err != nil { + t.Fatalf("BuildFileValidatorCode() error = %v", err) + } + + want := `// Code generated by ValidGen. DO NOT EDIT. + +//nolint:all +package main + +import ( + "strings" + + "github.com/opencodeco/validgen/types" +) + +func UserValidate(obj *User) []error { + var errs []error + if !(strings.EqualFold(obj.Name, "abc")) { + errs = append(errs, types.NewValidationError("Name must be equal to 'abc'")) + } + return errs +} +` + if got != want { + dmp := diffmatchpatch.New() + t.Errorf("BuildFileValidatorCode() diff =\n%s", dmp.DiffPrettyText(dmp.DiffMain(want, got, false))) + } +} diff --git a/tests/cmpbenchtests/validator__.go b/tests/cmpbenchtests/validator__.go index 5b0ff24..53f2c25 100755 --- a/tests/cmpbenchtests/validator__.go +++ b/tests/cmpbenchtests/validator__.go @@ -4,6 +4,8 @@ package benchtests import ( + "strings" + "github.com/opencodeco/validgen/types" ) @@ -219,14 +221,14 @@ func ValidGenEqUintStructValidate(obj *ValidGenEqUintStruct) []error { } func ValidGenEq_ignore_caseStringPointerStructValidate(obj *ValidGenEq_ignore_caseStringPointerStruct) []error { var errs []error - if !(obj.Field != nil && types.EqualFold(*obj.Field, "abcde")) { + if !(obj.Field != nil && strings.EqualFold(*obj.Field, "abcde")) { errs = append(errs, types.NewValidationError("Field must be equal to 'abcde'")) } return errs } func ValidGenEq_ignore_caseStringStructValidate(obj *ValidGenEq_ignore_caseStringStruct) []error { var errs []error - if !(types.EqualFold(obj.Field, "abcde")) { + if !(strings.EqualFold(obj.Field, "abcde")) { errs = append(errs, types.NewValidationError("Field must be equal to 'abcde'")) } return errs @@ -2473,14 +2475,14 @@ func ValidGenNeqUintStructValidate(obj *ValidGenNeqUintStruct) []error { } func ValidGenNeq_ignore_caseStringPointerStructValidate(obj *ValidGenNeq_ignore_caseStringPointerStruct) []error { var errs []error - if !(obj.Field != nil && !types.EqualFold(*obj.Field, "abcde")) { + if !(obj.Field != nil && !strings.EqualFold(*obj.Field, "abcde")) { errs = append(errs, types.NewValidationError("Field must not be equal to 'abcde'")) } return errs } func ValidGenNeq_ignore_caseStringStructValidate(obj *ValidGenNeq_ignore_caseStringStruct) []error { var errs []error - if !(!types.EqualFold(obj.Field, "abcde")) { + if !(!strings.EqualFold(obj.Field, "abcde")) { errs = append(errs, types.NewValidationError("Field must not be equal to 'abcde'")) } return errs diff --git a/tests/endtoend/validator__.go b/tests/endtoend/validator__.go index 64f5f68..73b180e 100755 --- a/tests/endtoend/validator__.go +++ b/tests/endtoend/validator__.go @@ -4,6 +4,8 @@ package main import ( + "strings" + "github.com/opencodeco/validgen/tests/endtoend/structsinpkg" "github.com/opencodeco/validgen/types" ) @@ -407,14 +409,14 @@ func eqStructFieldsPointerValidate(obj *eqStructFieldsPointer) []error { } func eq_ignore_caseStructFieldsValidate(obj *eq_ignore_caseStructFields) []error { var errs []error - if !(types.EqualFold(obj.FieldEq_ignore_caseString, "abcde")) { + if !(strings.EqualFold(obj.FieldEq_ignore_caseString, "abcde")) { errs = append(errs, types.NewValidationError("FieldEq_ignore_caseString must be equal to 'abcde'")) } return errs } func eq_ignore_caseStructFieldsPointerValidate(obj *eq_ignore_caseStructFieldsPointer) []error { var errs []error - if !(obj.FieldEq_ignore_caseStringPointer != nil && types.EqualFold(*obj.FieldEq_ignore_caseStringPointer, "abcde")) { + if !(obj.FieldEq_ignore_caseStringPointer != nil && strings.EqualFold(*obj.FieldEq_ignore_caseStringPointer, "abcde")) { errs = append(errs, types.NewValidationError("FieldEq_ignore_caseStringPointer must be equal to 'abcde'")) } return errs @@ -1723,14 +1725,14 @@ func neqStructFieldsPointerValidate(obj *neqStructFieldsPointer) []error { } func neq_ignore_caseStructFieldsValidate(obj *neq_ignore_caseStructFields) []error { var errs []error - if !(!types.EqualFold(obj.FieldNeq_ignore_caseString, "abcde")) { + if !(!strings.EqualFold(obj.FieldNeq_ignore_caseString, "abcde")) { errs = append(errs, types.NewValidationError("FieldNeq_ignore_caseString must not be equal to 'abcde'")) } return errs } func neq_ignore_caseStructFieldsPointerValidate(obj *neq_ignore_caseStructFieldsPointer) []error { var errs []error - if !(obj.FieldNeq_ignore_caseStringPointer != nil && !types.EqualFold(*obj.FieldNeq_ignore_caseStringPointer, "abcde")) { + if !(obj.FieldNeq_ignore_caseStringPointer != nil && !strings.EqualFold(*obj.FieldNeq_ignore_caseStringPointer, "abcde")) { errs = append(errs, types.NewValidationError("FieldNeq_ignore_caseStringPointer must not be equal to 'abcde'")) } return errs diff --git a/types/string_utils.go b/types/string_utils.go index 73cd342..0789f55 100644 --- a/types/string_utils.go +++ b/types/string_utils.go @@ -3,17 +3,12 @@ package types import ( "regexp" "slices" - "strings" ) // emailRegex is a pre-compiled regex for email validation // This avoids recompiling the regex on every validation call var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`) -func EqualFold(s, t string) bool { - return strings.EqualFold(s, t) -} - // IsValidEmail validates if a string is a valid email format // Returns true for valid email format, false otherwise func IsValidEmail(email string) bool {