diff --git a/desense/default_test.go b/desense/default_test.go index 27a9ffe..206df09 100644 --- a/desense/default_test.go +++ b/desense/default_test.go @@ -12,15 +12,41 @@ func TestDeSense(t *testing.T) { } type TestMaskStuct struct { + Name string `json:"name"` PhoneNumber string `json:"phone_number" mask:",5,4"` } func TestMusk(t *testing.T) { tm := &TestMaskStuct{ PhoneNumber: "1234567890123", + Name: "test", } + if err := desense.MaskStruct(tm); err != nil { t.Fatal(err) } t.Log(tm.PhoneNumber) + t.Log(tm.Name) +} + +var set = &TestMaskStuctSet{ + Items: []*TestMaskStuct{ + { + PhoneNumber: "1234567890123", + }, + }, +} + +type TestMaskStuctSet struct { + Items []*TestMaskStuct `json:"items"` +} + +func TestMuskSet(t *testing.T) { + if err := desense.MaskStruct(set); err != nil { + t.Fatal(err) + } + + for _, v := range set.Items { + t.Log(v.PhoneNumber) + } } diff --git a/desense/desense.go b/desense/desense.go index f5741f9..b0f2ba1 100644 --- a/desense/desense.go +++ b/desense/desense.go @@ -13,40 +13,46 @@ func MaskStruct(s any) error { } v := reflect.ValueOf(s).Elem() - typ := v.Type() + t := v.Type() for i := 0; i < v.NumField(); i++ { - field := v.Field(i) - tag := typ.Field(i).Tag.Get("mask") - - muskLine := strings.Split(tag, ",") - desensorName := "default" - if len(muskLine) > 0 { - dn := muskLine[0] - if dn != "" { - desensorName = dn + fieldValue := v.Field(i) + switch fieldValue.Kind() { + case reflect.Slice: + for i := 0; i < fieldValue.Len(); i++ { + MaskStruct(fieldValue.Index(i).Interface()) } - } - desensorParam := []string{} - if len(muskLine) > 1 { - desensorParam = muskLine[1:] - } - - desenfor := Get(desensorName) - if desenfor == nil { - return fmt.Errorf("desenfor %s not found", desensorName) - } - - if field.Kind() == reflect.Struct { - MaskStruct(field.Addr().Interface()) - } else { - fieldValue := v.Field(i).Interface() - if vStr, ok := fieldValue.(string); ok { - field.SetString(desenfor.DeSense(vStr, desensorParam...)) + case reflect.Struct: + MaskStruct(fieldValue.Addr().Interface()) + default: + tag := t.Field(i).Tag.Get("mask") + if tag == "" { + continue + } + name, args := ParseStructTag(tag) + desenfor := Get(name) + if desenfor == nil { + return fmt.Errorf("desenfor %s not found", name) + } + if vStr, ok := fieldValue.Interface().(string); ok { + fieldValue.SetString(desenfor.DeSense(vStr, args...)) } } - } - return nil } + +func ParseStructTag(v string) (name string, args []string) { + muskLine := strings.Split(v, ",") + name = "default" + if len(muskLine) > 0 { + dn := muskLine[0] + if dn != "" { + name = dn + } + } + if len(muskLine) > 1 { + args = muskLine[1:] + } + return +}