From b284664de4ac1c1a89a355003b6ceb96db93e183 Mon Sep 17 00:00:00 2001 From: Qiu shao Date: Fri, 12 Dec 2025 23:24:10 +0800 Subject: [PATCH] perf(mapping): use strings.EqualFold to optimize bool parsing (#5324) Co-authored-by: qiuwenhao --- core/mapping/utils.go | 11 +++++------ core/mapping/utils_test.go | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/core/mapping/utils.go b/core/mapping/utils.go index 3e08095ad..1c281e328 100644 --- a/core/mapping/utils.go +++ b/core/mapping/utils.go @@ -104,14 +104,13 @@ func convertToString(val any, fullName string) (string, error) { func convertTypeFromString(kind reflect.Kind, str string) (any, error) { switch kind { case reflect.Bool: - switch strings.ToLower(str) { - case "1", "true": + if str == "1" || strings.EqualFold(str, "true") { return true, nil - case "0", "false": - return false, nil - default: - return false, errTypeMismatch } + if str == "0" || strings.EqualFold(str, "false") { + return false, nil + } + return false, errTypeMismatch case reflect.Int: return strconv.ParseInt(str, 10, intSize) case reflect.Int8: diff --git a/core/mapping/utils_test.go b/core/mapping/utils_test.go index cbb1208d0..e72c606f5 100644 --- a/core/mapping/utils_test.go +++ b/core/mapping/utils_test.go @@ -334,3 +334,43 @@ func TestValidateValueRange(t *testing.T) { func TestSetMatchedPrimitiveValue(t *testing.T) { assert.Error(t, setMatchedPrimitiveValue(reflect.Func, reflect.ValueOf(2), "1")) } + +func TestConvertTypeFromString_Bool(t *testing.T) { + tests := []struct { + name string + input string + want bool + wantErr bool + }{ + // true cases + {name: "1", input: "1", want: true, wantErr: false}, + {name: "true lowercase", input: "true", want: true, wantErr: false}, + {name: "True mixed", input: "True", want: true, wantErr: false}, + {name: "TRUE uppercase", input: "TRUE", want: true, wantErr: false}, + {name: "TrUe mixed", input: "TrUe", want: true, wantErr: false}, + // false cases + {name: "0", input: "0", want: false, wantErr: false}, + {name: "false lowercase", input: "false", want: false, wantErr: false}, + {name: "False mixed", input: "False", want: false, wantErr: false}, + {name: "FALSE uppercase", input: "FALSE", want: false, wantErr: false}, + {name: "FaLsE mixed", input: "FaLsE", want: false, wantErr: false}, + // error cases + {name: "invalid yes", input: "yes", want: false, wantErr: true}, + {name: "invalid no", input: "no", want: false, wantErr: true}, + {name: "invalid empty", input: "", want: false, wantErr: true}, + {name: "invalid 2", input: "2", want: false, wantErr: true}, + {name: "invalid truee", input: "truee", want: false, wantErr: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := convertTypeFromString(reflect.Bool, tt.input) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.want, got) + } + }) + } +}