1
1
package opts
2
2
3
3
import (
4
+ "fmt"
5
+ "sync"
4
6
"syscall"
5
7
6
8
"go.uber.org/zap"
@@ -17,71 +19,151 @@ const (
17
19
DefaultKillSignal = syscall .SIGINT
18
20
)
19
21
20
- // Env is a string that identifies an environment.
21
- type Env string
22
+ var (
23
+ // ErrNotFound signals that this option is not set.
24
+ ErrNotFound = fmt .Errorf ("option not found" )
25
+ )
26
+
27
+ // Opt ...
28
+ type Opt int
22
29
23
30
const (
24
- // Development symbolizes a development environment this program runs in.
25
- Development Env = "development"
26
- // Production symbolizes a production environment this program runs in.
27
- Production Env = "production"
31
+ // Verbose ...
32
+ Verbose Opt = iota
33
+ // ReloadSignal ...
34
+ ReloadSignal
35
+ // TermSignal ...
36
+ TermSignal
37
+ // KillSignal ...
38
+ KillSignal
39
+ // Logger ...
40
+ Logger
28
41
)
29
42
30
43
// Opts ...
31
- type Opts struct {
32
- // Verbose toggles verbosity
33
- Verbose bool
44
+ type Opts interface {
45
+ // Get ...
46
+ Get (Opt ) (interface {}, error )
47
+ // Set ...
48
+ Set (Opt , interface {})
49
+ // Configure ...
50
+ Configure (... OptFunc )
51
+ }
52
+
53
+ // DefaultOpts ...
54
+ type DefaultOpts interface {
55
+ // Verbose ...
56
+ Verbose () bool
34
57
// ReloadSignal ...
35
- ReloadSignal syscall.Signal
58
+ ReloadSignal () syscall.Signal
36
59
// TermSignal ...
37
- TermSignal syscall.Signal
60
+ TermSignal () syscall.Signal
38
61
// KillSignal ...
39
- KillSignal syscall.Signal
40
- // Logger ...
41
- Logger * zap.Logger
42
- // Env ...
43
- Env Env
62
+ KillSignal () syscall.Signal
63
+
64
+ Opts
44
65
}
45
66
46
- // Opt is an option
47
- type Opt func (* Opts )
67
+ // OptFunc is an option
68
+ type OptFunc func (Opts )
69
+
70
+ // Options is default options structure.
71
+ type Options struct {
72
+ opts map [Opt ]interface {}
73
+
74
+ sync.RWMutex
75
+ }
76
+
77
+ // DefaultOptions are a collection of default options.
78
+ type DefaultOptions struct {
79
+ Options
80
+ }
48
81
49
82
// New returns a new instance of the options.
50
- func New (opts ... Opt ) * Opts {
51
- o := NewDefaultOpts ( )
83
+ func New (opts ... OptFunc ) Opts {
84
+ o := new ( Options )
52
85
o .Configure (opts ... )
53
86
54
87
return o
55
88
}
56
89
57
90
// NewDefaultOpts returns options with a default configuration.
58
- func NewDefaultOpts () * Opts {
59
- return & Opts {
60
- Verbose : DefaultVerbose ,
61
- ReloadSignal : DefaultReloadSignal ,
62
- TermSignal : DefaultTermSignal ,
63
- KillSignal : DefaultKillSignal ,
64
- Env : Development ,
65
- }
91
+ func NewDefaultOpts (opts ... OptFunc ) DefaultOpts {
92
+ o := new (DefaultOptions )
93
+ o .Configure (opts ... )
94
+
95
+ o .Set (Verbose , DefaultVerbose )
96
+ o .Set (ReloadSignal , DefaultReloadSignal )
97
+ o .Set (TermSignal , DefaultTermSignal )
98
+ o .Set (KillSignal , DefaultKillSignal )
99
+
100
+ return o
66
101
}
67
102
68
- // WithLogger is setting a logger for options
69
- func WithLogger (logger * zap.Logger ) Opt {
70
- return func (opts * Opts ) {
71
- opts .Logger = logger
103
+ // Verbose ...
104
+ func (o * DefaultOptions ) Verbose () bool {
105
+ v , _ := o .Get (Verbose )
106
+
107
+ return v .(bool )
108
+ }
109
+
110
+ // ReloadSignal ...
111
+ func (o * DefaultOptions ) ReloadSignal () syscall.Signal {
112
+ v , _ := o .Get (ReloadSignal )
113
+
114
+ return v .(syscall.Signal )
115
+ }
116
+
117
+ // TermSignal ...
118
+ func (o * DefaultOptions ) TermSignal () syscall.Signal {
119
+ v , _ := o .Get (TermSignal )
120
+
121
+ return v .(syscall.Signal )
122
+ }
123
+
124
+ // KillSignal ...
125
+ func (o * DefaultOptions ) KillSignal () syscall.Signal {
126
+ v , _ := o .Get (KillSignal )
127
+
128
+ return v .(syscall.Signal )
129
+ }
130
+
131
+ // WithLogger is setting a logger for options.
132
+ func WithLogger (logger * zap.Logger ) OptFunc {
133
+ return func (opts Opts ) {
134
+ opts .Set (Logger , logger )
72
135
}
73
136
}
74
137
75
- // WithEnv configures a new environment.
76
- func WithEnv (env Env ) Opt {
77
- return func (opts * Opts ) {
78
- opts .Env = env
138
+ // Get ...
139
+ func (o * Options ) Get (opt Opt ) (interface {}, error ) {
140
+ o .RLock ()
141
+ defer o .RUnlock ()
142
+
143
+ v , ok := o .opts [opt ]
144
+ if ! ok {
145
+ return nil , ErrNotFound
146
+
79
147
}
148
+
149
+ return v , nil
150
+ }
151
+
152
+ // Set ...
153
+ func (o * Options ) Set (opt Opt , v interface {}) {
154
+ o .Lock ()
155
+ defer o .Unlock ()
156
+
157
+ o .opts [opt ] = v
80
158
}
81
159
82
160
// Configure os configuring the options.
83
- func (s * Opts ) Configure (opts ... Opt ) {
84
- for _ , o := range opts {
85
- o (s )
161
+ func (o * Options ) Configure (opts ... OptFunc ) {
162
+ if o .opts == nil {
163
+ o .opts = make (map [Opt ]interface {})
164
+ }
165
+
166
+ for _ , opt := range opts {
167
+ opt (o )
86
168
}
87
169
}
0 commit comments