Skip to content
This repository was archived by the owner on Aug 3, 2022. It is now read-only.

Commit dcd1ff1

Browse files
committedNov 30, 2020
chore: new opts interface
1 parent dce0d62 commit dcd1ff1

File tree

5 files changed

+153
-164
lines changed

5 files changed

+153
-164
lines changed
 

‎examples/server/simple.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/go-chi/chi"
1111
"github.com/go-chi/chi/middleware"
1212

13+
"github.com/andersnormal/pkg/debug"
1314
"github.com/andersnormal/pkg/server"
1415
)
1516

@@ -42,9 +43,9 @@ func main() {
4243

4344
s, _ := server.WithContext(ctx)
4445

45-
d := server.NewDebugListener(
46-
server.WithPprof(),
47-
server.WithStatusAddr(":8443"),
46+
d := debug.New(
47+
debug.WithPprof(),
48+
debug.WithStatusAddr(":8443"),
4849
)
4950
s.Listen(d, false)
5051
s.Listen(&srv{}, true)

‎opts/opts.go

+121-39
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package opts
22

33
import (
4+
"fmt"
5+
"sync"
46
"syscall"
57

68
"go.uber.org/zap"
@@ -17,71 +19,151 @@ const (
1719
DefaultKillSignal = syscall.SIGINT
1820
)
1921

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
2229

2330
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
2841
)
2942

3043
// 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
3457
// ReloadSignal ...
35-
ReloadSignal syscall.Signal
58+
ReloadSignal() syscall.Signal
3659
// TermSignal ...
37-
TermSignal syscall.Signal
60+
TermSignal() syscall.Signal
3861
// KillSignal ...
39-
KillSignal syscall.Signal
40-
// Logger ...
41-
Logger *zap.Logger
42-
// Env ...
43-
Env Env
62+
KillSignal() syscall.Signal
63+
64+
Opts
4465
}
4566

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+
}
4881

4982
// 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)
5285
o.Configure(opts...)
5386

5487
return o
5588
}
5689

5790
// 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
66101
}
67102

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)
72135
}
73136
}
74137

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+
79147
}
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
80158
}
81159

82160
// 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)
86168
}
87169
}

‎opts/opts_test.go

+20-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
11
package opts
22

33
import (
4-
"syscall"
54
"testing"
65

76
"github.com/stretchr/testify/assert"
87
"go.uber.org/zap"
98
)
109

11-
func TestConfig_New(t *testing.T) {
12-
o := New()
10+
func TestConfig_NewDefaultOpts(t *testing.T) {
11+
var cond = []struct {
12+
desc string
13+
in Opt
14+
out interface{}
15+
}{
16+
{desc: "", in: Verbose, out: false},
17+
}
1318

14-
assert.Equal(t, o.Verbose, false)
15-
assert.Equal(t, o.Env, Development)
16-
assert.Equal(t, o.KillSignal, syscall.SIGINT)
17-
assert.Equal(t, o.ReloadSignal, syscall.SIGHUP)
18-
assert.Equal(t, o.TermSignal, syscall.SIGTERM)
19-
assert.Nil(t, o.Logger)
19+
for _, tt := range cond {
20+
t.Run(tt.desc, func(t *testing.T) {
21+
o := NewDefaultOpts()
22+
23+
v, err := o.Get(tt.in)
24+
assert.NoError(t, err)
25+
assert.Equal(t, tt.out, v)
26+
})
27+
}
2028
}
2129

2230
func TestConfig_WithLogger(t *testing.T) {
@@ -25,10 +33,7 @@ func TestConfig_WithLogger(t *testing.T) {
2533
assert.NoError(t, err)
2634

2735
o := New(WithLogger(logger))
28-
assert.NotNil(t, o.Logger)
29-
}
30-
31-
func TestConfig_WithName(t *testing.T) {
32-
o := New(WithEnv(Env("fooBar")))
33-
assert.Equal(t, o.Env, Env("fooBar"))
36+
v, err := o.Get(Logger)
37+
assert.NoError(t, err)
38+
assert.NotNil(t, v)
3439
}

‎server/debug.go

-102
This file was deleted.

‎server/server.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77
"os/signal"
88
"sync"
9+
"syscall"
910
"time"
1011

1112
o "github.com/andersnormal/pkg/opts"
@@ -72,11 +73,11 @@ type server struct {
7273
ready chan bool
7374
sys chan os.Signal
7475

75-
opts *o.Opts
76+
opts o.Opts
7677
}
7778

7879
// WithContext ...
79-
func WithContext(ctx context.Context, opts ...o.Opt) (Server, context.Context) {
80+
func WithContext(ctx context.Context, opts ...o.OptFunc) (Server, context.Context) {
8081
ctx, cancel := context.WithCancel(ctx)
8182

8283
// new server
@@ -87,8 +88,8 @@ func WithContext(ctx context.Context, opts ...o.Opt) (Server, context.Context) {
8788
return s, ctx
8889
}
8990

90-
func newServer(ctx context.Context, opts ...o.Opt) *server {
91-
options := o.New(opts...)
91+
func newServer(ctx context.Context, opts ...o.OptFunc) *server {
92+
options := o.NewDefaultOpts(opts...)
9293

9394
s := new(server)
9495
s.opts = options
@@ -189,5 +190,7 @@ func (s *server) run(f func() error) {
189190

190191
func configureSignals(s *server) {
191192
s.sys = make(chan os.Signal, 1)
192-
signal.Notify(s.sys, s.opts.TermSignal)
193+
term, _ := s.opts.Get(o.TermSignal)
194+
195+
signal.Notify(s.sys, term.(syscall.Signal))
193196
}

0 commit comments

Comments
 (0)
This repository has been archived.