-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexample_test.go
112 lines (94 loc) · 2.68 KB
/
example_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package gowalker_test
import (
"fmt"
"reflect"
"strings"
"time"
"github.com/vkd/gowalker"
"github.com/vkd/gowalker/config"
"github.com/vkd/gowalker/setter"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
type titleName string
func (c *titleName) SetString(s string) error {
*c = titleName(cases.Title(language.Und).String(s) + "!")
return nil
}
func Example() {
var cfg struct {
Name titleName
Timeout time.Duration `default:"3s"`
DB struct {
Username string `required:""`
Password string `required:""`
}
Metrics struct {
Addr string `env:"METRICS_URL"`
}
}
// osLookupEnv := os.LookupEnv
osLookupEnv := func(key string) (string, bool) {
v, ok := map[string]string{
"MY_ORG_DB_USERNAME": "postgres",
"MY_ORG_METRICS_URL": "localhost:5678",
}[key]
return v, ok
}
// osArgs := os.Args
osArgs := []string{"gowalker", "--timeout=5s", "--db-password", "example", "--name=gowalker"}
err := config.Walk(&cfg, nil,
gowalker.Flags(gowalker.FieldKey("flag", gowalker.Fullname("-", strings.ToLower)), osArgs),
gowalker.Envs(gowalker.Prefix("MY_ORG_", gowalker.FieldKey("env", gowalker.Fullname("_", strings.ToUpper))), osLookupEnv),
gowalker.Tag("default"),
gowalker.Required("required"),
)
fmt.Printf("%v, %v", cfg, err)
// Output: {Gowalker! 5s {postgres example} {localhost:5678}}, <nil>
}
func ExampleWalk_fromMapOfStrings() {
var q struct {
Name string `uri:"name"`
Age int `uri:"age"`
Friends []string `uri:"friends"`
Coins []int `uri:"coins"`
Keys []int
}
uri := map[string][]string{
"name": {"mike"},
"friends": {"igor", "alisa"},
}
fk := gowalker.FieldKey("uri", gowalker.DefaultNamer)
w := gowalker.WalkerFunc(func(value reflect.Value, field reflect.StructField, fs gowalker.Fields) (stop bool, _ error) {
key := fk.FieldKey(field, fs)
v, ok := uri[key]
if !ok {
return false, nil
}
return true, setter.SetSliceStrings(value, field, v)
})
err := gowalker.Walk(&q, gowalker.MakeFields(1), w)
fmt.Printf("%+v, %v", q, err)
// Output: {Name:mike Age:0 Friends:[igor alisa] Coins:[] Keys:[]}, <nil>
}
type visitedFields []string
func (f *visitedFields) Step(value reflect.Value, field reflect.StructField, fs gowalker.Fields) (set bool, err error) {
key := gowalker.DashToLoverNamer.Key(fs.Names())
*f = append(*f, key)
return false, nil
}
func ExampleWalk_collectAllPublicFields() {
var config struct {
Name string
Port int
DB struct {
URL string
Port int
}
StartedAt time.Time
}
var fs visitedFields
err := gowalker.Walk(&config, gowalker.MakeFields(2), &fs)
fmt.Printf("fields: %v, %v", fs, err)
// Output: fields: [name port db-url db-port startedat], <nil>
}