63 lines
1004 B
Go
63 lines
1004 B
Go
package opt
|
|
|
|
import (
|
|
"github.com/spf13/viper"
|
|
"go.uber.org/dig"
|
|
)
|
|
|
|
type Options struct {
|
|
Config *viper.Viper
|
|
Prefix string
|
|
Name string
|
|
Group string
|
|
}
|
|
|
|
type Option func(o *Options)
|
|
|
|
func New(opts ...Option) *Options {
|
|
o := &Options{}
|
|
for _, opt := range opts {
|
|
opt(o)
|
|
}
|
|
return o
|
|
}
|
|
|
|
func (o *Options) UnmarshalConfig(config interface{}) error {
|
|
return o.Config.UnmarshalKey(o.Prefix, &config)
|
|
}
|
|
|
|
func (o *Options) DiOptions() []dig.ProvideOption {
|
|
options := []dig.ProvideOption{}
|
|
if o.Name != "" {
|
|
options = append(options, dig.Name(o.Name))
|
|
}
|
|
if o.Group != "" {
|
|
options = append(options, dig.Group(o.Group))
|
|
}
|
|
return options
|
|
}
|
|
|
|
func Config(config *viper.Viper) Option {
|
|
return func(o *Options) {
|
|
o.Config = config
|
|
}
|
|
}
|
|
|
|
func Name(name string) Option {
|
|
return func(o *Options) {
|
|
o.Name = name
|
|
}
|
|
}
|
|
|
|
func Group(group string) Option {
|
|
return func(o *Options) {
|
|
o.Group = group
|
|
}
|
|
}
|
|
|
|
func Prefix(prefix string) Option {
|
|
return func(o *Options) {
|
|
o.Prefix = prefix
|
|
}
|
|
}
|