Skip to content

Commit ac8540f

Browse files
committed
defaults.go refactor based on filler
1 parent 801c268 commit ac8540f

File tree

1 file changed

+41
-93
lines changed

1 file changed

+41
-93
lines changed

defaults.go

Lines changed: 41 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ import (
55
"strconv"
66
)
77

8-
type fieldData struct {
9-
Field reflect.StructField
10-
Value reflect.Value
11-
}
12-
138
// Applies the default values to the struct object, the struct type must have
149
// the StructTag with name "default" and the directed value.
1510
//
@@ -23,118 +18,71 @@ type fieldData struct {
2318
// foo := &ExampleBasic{}
2419
// SetDefaults(foo)
2520
func SetDefaults(variable interface{}) {
26-
fields := getFields(variable)
27-
setDefaultValues(fields)
28-
}
29-
30-
func getFields(variable interface{}) []*fieldData {
31-
valueObject := reflect.ValueOf(variable).Elem()
32-
33-
return getFieldsFromValue(valueObject)
21+
getDefaultFiller().Fill(variable)
3422
}
3523

36-
func getFieldsFromValue(valueObject reflect.Value) []*fieldData {
37-
typeObject := valueObject.Type()
24+
var defaultFiller *Filler = nil
3825

39-
count := valueObject.NumField()
40-
results := make([]*fieldData, 0)
41-
for i := 0; i < count; i++ {
42-
value := valueObject.Field(i)
43-
field := typeObject.Field(i)
44-
45-
if value.CanSet() {
46-
results = append(results, &fieldData{
47-
Value: value,
48-
Field: field,
49-
})
50-
}
26+
func getDefaultFiller() *Filler {
27+
if defaultFiller == nil {
28+
defaultFiller = newDefaultFiller()
5129
}
5230

53-
return results
31+
return defaultFiller
5432
}
5533

56-
func setDefaultValues(fields []*fieldData) {
57-
for _, field := range fields {
58-
setDefaultValue(field)
34+
func newDefaultFiller() *Filler {
35+
funcs := make(map[reflect.Kind]fillerFunc, 0)
36+
funcs[reflect.Bool] = func(field *fieldData, defaultValue string) {
37+
value, _ := strconv.ParseBool(defaultValue)
38+
field.Value.SetBool(value)
5939
}
60-
}
6140

62-
func setDefaultValue(field *fieldData) {
63-
defaultValue := field.Field.Tag.Get("default")
64-
65-
switch field.Value.Kind() {
66-
case reflect.Bool:
67-
setDefaultValueToBool(field, defaultValue)
68-
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
69-
setDefaultValueToInt(field, defaultValue)
70-
case reflect.Float32, reflect.Float64:
71-
setDefaultValueToFloat(field, defaultValue)
72-
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
73-
setDefaultValueToUint(field, defaultValue)
74-
case reflect.Slice:
75-
setDefaultValueToSlice(field, defaultValue)
76-
case reflect.String:
77-
setDefaultValueToString(field, defaultValue)
78-
case reflect.Struct:
79-
setDefaultValueToStruct(field, defaultValue)
41+
funcs[reflect.Int] = func(field *fieldData, defaultValue string) {
42+
value, _ := strconv.ParseInt(defaultValue, 10, 64)
43+
field.Value.SetInt(value)
8044
}
81-
}
8245

83-
func setDefaultValueToBool(field *fieldData, defaultValue string) {
84-
if field.Value.Bool() != false {
85-
return
86-
}
46+
funcs[reflect.Int8] = funcs[reflect.Int]
47+
funcs[reflect.Int16] = funcs[reflect.Int]
48+
funcs[reflect.Int32] = funcs[reflect.Int]
49+
funcs[reflect.Int64] = funcs[reflect.Int]
8750

88-
value, _ := strconv.ParseBool(defaultValue)
89-
field.Value.SetBool(value)
90-
}
91-
92-
func setDefaultValueToInt(field *fieldData, defaultValue string) {
93-
if field.Value.Int() != 0 {
94-
return
51+
funcs[reflect.Float32] = func(field *fieldData, defaultValue string) {
52+
value, _ := strconv.ParseFloat(defaultValue, 64)
53+
field.Value.SetFloat(value)
9554
}
9655

97-
value, _ := strconv.ParseInt(defaultValue, 10, 64)
98-
field.Value.SetInt(value)
99-
}
56+
funcs[reflect.Float64] = funcs[reflect.Float32]
10057

101-
func setDefaultValueToFloat(field *fieldData, defaultValue string) {
102-
if field.Value.Float() != .0 {
103-
return
58+
funcs[reflect.Uint] = func(field *fieldData, defaultValue string) {
59+
value, _ := strconv.ParseUint(defaultValue, 10, 64)
60+
field.Value.SetUint(value)
10461
}
10562

106-
value, _ := strconv.ParseFloat(defaultValue, 64)
107-
field.Value.SetFloat(value)
108-
}
63+
funcs[reflect.Uint8] = funcs[reflect.Uint]
64+
funcs[reflect.Uint16] = funcs[reflect.Uint]
65+
funcs[reflect.Uint32] = funcs[reflect.Uint]
66+
funcs[reflect.Uint64] = funcs[reflect.Uint]
10967

110-
func setDefaultValueToUint(field *fieldData, defaultValue string) {
111-
if field.Value.Uint() != 0 {
112-
return
68+
funcs[reflect.String] = func(field *fieldData, defaultValue string) {
69+
field.Value.SetString(defaultValue)
11370
}
11471

115-
value, _ := strconv.ParseUint(defaultValue, 10, 64)
116-
field.Value.SetUint(value)
117-
}
72+
funcs[reflect.Slice] = func(field *fieldData, defaultValue string) {
73+
if field.Value.Type().Elem().Kind() == reflect.Uint8 {
74+
if field.Value.Bytes() != nil {
75+
return
76+
}
11877

119-
func setDefaultValueToSlice(field *fieldData, defaultValue string) {
120-
if field.Value.Type().Elem().Kind() == reflect.Uint8 {
121-
if field.Value.Bytes() != nil {
122-
return
78+
field.Value.SetBytes([]byte(defaultValue))
12379
}
124-
125-
field.Value.SetBytes([]byte(defaultValue))
12680
}
127-
}
12881

129-
func setDefaultValueToString(field *fieldData, defaultValue string) {
130-
if field.Value.String() != "" {
131-
return
82+
funcs[reflect.Struct] = func(field *fieldData, defaultValue string) {
83+
fields := getDefaultFiller().getFieldsFromValue(field.Value)
84+
getDefaultFiller().setDefaultValues(fields)
13285
}
13386

134-
field.Value.SetString(defaultValue)
135-
}
136-
137-
func setDefaultValueToStruct(field *fieldData, defaultValue string) {
138-
fields := getFieldsFromValue(field.Value)
139-
setDefaultValues(fields)
87+
return &Filler{FuncByKind: funcs, Tag: "default"}
14088
}

0 commit comments

Comments
 (0)