Skip to content

Commit f686c05

Browse files
committed
defaults skip if defined
1 parent ea0a41d commit f686c05

File tree

3 files changed

+63
-16
lines changed

3 files changed

+63
-16
lines changed

.travis.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
language: go
22

3+
go:
4+
- 1.1
5+
- 1.2
6+
- tip
7+
38
script:
4-
- go get github.com/mcuadros/go-defaults
9+
- go get launchpad.net/gocheck
510
- go test

defaults.go

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import (
55
"strconv"
66
)
77

8-
type Field struct {
8+
type fieldData struct {
99
Field reflect.StructField
1010
Value reflect.Value
1111
}
1212

13-
// Apply the default values to the struct object, the struct type must have
13+
// Applies the default values to the struct object, the struct type must have
1414
// the StructTag with name "default" and the directed value.
1515
//
1616
// Usage
@@ -27,23 +27,23 @@ func SetDefaults(variable interface{}) {
2727
setDefaultValues(fields)
2828
}
2929

30-
func getFields(variable interface{}) []*Field {
30+
func getFields(variable interface{}) []*fieldData {
3131
valueObject := reflect.ValueOf(variable).Elem()
3232

3333
return getFieldsFromValue(valueObject)
3434
}
3535

36-
func getFieldsFromValue(valueObject reflect.Value) []*Field {
36+
func getFieldsFromValue(valueObject reflect.Value) []*fieldData {
3737
typeObject := valueObject.Type()
3838

3939
count := valueObject.NumField()
40-
results := make([]*Field, 0)
40+
results := make([]*fieldData, 0)
4141
for i := 0; i < count; i++ {
4242
value := valueObject.Field(i)
4343
field := typeObject.Field(i)
4444

4545
if value.CanSet() {
46-
results = append(results, &Field{
46+
results = append(results, &fieldData{
4747
Value: value,
4848
Field: field,
4949
})
@@ -53,13 +53,13 @@ func getFieldsFromValue(valueObject reflect.Value) []*Field {
5353
return results
5454
}
5555

56-
func setDefaultValues(fields []*Field) {
56+
func setDefaultValues(fields []*fieldData) {
5757
for _, field := range fields {
5858
setDefaultValue(field)
5959
}
6060
}
6161

62-
func setDefaultValue(field *Field) {
62+
func setDefaultValue(field *fieldData) {
6363
defaultValue := field.Field.Tag.Get("default")
6464

6565
switch field.Value.Kind() {
@@ -80,37 +80,61 @@ func setDefaultValue(field *Field) {
8080
}
8181
}
8282

83-
func setDefaultValueToBool(field *Field, defaultValue string) {
83+
func setDefaultValueToBool(field *fieldData, defaultValue string) {
84+
if field.Value.Bool() != false {
85+
return
86+
}
87+
8488
value, _ := strconv.ParseBool(defaultValue)
8589
field.Value.SetBool(value)
8690
}
8791

88-
func setDefaultValueToInt(field *Field, defaultValue string) {
92+
func setDefaultValueToInt(field *fieldData, defaultValue string) {
93+
if field.Value.Int() != 0 {
94+
return
95+
}
96+
8997
value, _ := strconv.ParseInt(defaultValue, 10, 64)
9098
field.Value.SetInt(value)
9199
}
92100

93-
func setDefaultValueToFloat(field *Field, defaultValue string) {
101+
func setDefaultValueToFloat(field *fieldData, defaultValue string) {
102+
if field.Value.Float() != .0 {
103+
return
104+
}
105+
94106
value, _ := strconv.ParseFloat(defaultValue, 64)
95107
field.Value.SetFloat(value)
96108
}
97109

98-
func setDefaultValueToUint(field *Field, defaultValue string) {
110+
func setDefaultValueToUint(field *fieldData, defaultValue string) {
111+
if field.Value.Uint() != 0 {
112+
return
113+
}
114+
99115
value, _ := strconv.ParseUint(defaultValue, 10, 64)
100116
field.Value.SetUint(value)
101117
}
102118

103-
func setDefaultValueToSlice(field *Field, defaultValue string) {
119+
func setDefaultValueToSlice(field *fieldData, defaultValue string) {
104120
if field.Value.Type().Elem().Kind() == reflect.Uint8 {
121+
if field.Value.Bytes() != nil {
122+
return
123+
}
124+
105125
field.Value.SetBytes([]byte(defaultValue))
106126
}
107127
}
108128

109-
func setDefaultValueToString(field *Field, defaultValue string) {
129+
func setDefaultValueToString(field *fieldData, defaultValue string) {
130+
if field.Value.String() != "" {
131+
return
132+
}
133+
110134
field.Value.SetString(defaultValue)
111135
}
112136

113-
func setDefaultValueToStruct(field *Field, defaultValue string) {
137+
func setDefaultValueToStruct(field *fieldData, defaultValue string) {
114138
fields := getFieldsFromValue(field.Value)
115139
setDefaultValues(fields)
116140
}

defaults_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,21 @@ func (self *DefaultsSuite) assertTypes(c *C, foo *ExampleBasic) {
7070
c.Assert(foo.Float64, Equals, 6.4)
7171
c.Assert(foo.Struct.Bool, Equals, true)
7272
}
73+
74+
func (self *DefaultsSuite) TestSetDefaultsWithValues(c *C) {
75+
foo := &ExampleBasic{
76+
Integer: 55,
77+
UInteger: 22,
78+
Float32: 9.9,
79+
String: "bar",
80+
Bytes: []byte("foo"),
81+
}
82+
83+
SetDefaults(foo)
84+
85+
c.Assert(foo.Integer, Equals, 55)
86+
c.Assert(foo.UInteger, Equals, uint(22))
87+
c.Assert(foo.Float32, Equals, float32(9.9))
88+
c.Assert(foo.String, Equals, "bar")
89+
c.Assert(string(foo.Bytes), Equals, "foo")
90+
}

0 commit comments

Comments
 (0)