diff --git a/scan.go b/scan.go index 66c7bb7..d2d49fe 100644 --- a/scan.go +++ b/scan.go @@ -280,8 +280,17 @@ func (s sensitiveStruct) Replace(fn ReplaceFunc) error { if err != nil { return err } + if newVal != val { - elem.SetString(newVal) + switch ssField.sf.Type.Kind() { + case reflect.String: + elem.SetString(newVal) + default: + vv := reflect.ValueOf(newVal) + if vv.IsValid() && vv.Type().ConvertibleTo(elem.Type()) { + elem.Set(vv.Convert(elem.Type())) + } + } } continue } @@ -413,7 +422,7 @@ func scanStructTypeWithContext(c sensitiveStructContext, rt reflect.Type) (sensi if tt.Kind() == reflect.Ptr { tt = tt.Elem() } - if tt.Kind() != reflect.String { + if tt.Kind() != reflect.String && !field.Type.ConvertibleTo(stringType) { continue } sensitiveFields = append(sensitiveFields, ssField) diff --git a/scan_test.go b/scan_test.go index 3eafe76..de2c6a3 100644 --- a/scan_test.go +++ b/scan_test.go @@ -68,6 +68,23 @@ func TestScan(t *testing.T) { }, ok: true, }, + func() tc { + type T struct { + ID string `sensitive:"subjectID"` + Secret []byte `sensitive:"data"` + } + return tc{ + val: &T{ + ID: "abc", + Secret: []byte("company name"), + }, + want: &T{ + ID: "abc", + Secret: []byte(""), + }, + ok: true, + } + }(), func() tc { type T struct { Profile `sensitive:"dive"`