move options to dedicated package
Some checks failed
lint / lint (pull_request) Failing after 1m31s
pr / test (pull_request) Failing after 2m37s

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
2023-07-29 00:40:58 +03:00
parent b1dbd99ce2
commit 6f6f850af6
84 changed files with 1154 additions and 4521 deletions

View File

@@ -6,6 +6,8 @@ import (
"errors"
"reflect"
"time"
"go.unistack.org/micro/v4/options"
)
type Validator interface {
@@ -37,15 +39,15 @@ type Config interface {
// Name returns name of config
Name() string
// Init the config
Init(opts ...Option) error
Init(opts ...options.Option) error
// Options in the config
Options() Options
// Load config from sources
Load(context.Context, ...LoadOption) error
Load(context.Context, ...options.Option) error
// Save config to sources
Save(context.Context, ...SaveOption) error
Save(context.Context, ...options.Option) error
// Watch a config for changes
Watch(context.Context, ...WatchOption) (Watcher, error)
Watch(context.Context, ...options.Option) (Watcher, error)
// String returns config type name
String() string
}
@@ -59,7 +61,7 @@ type Watcher interface {
}
// Load loads config from config sources
func Load(ctx context.Context, cs []Config, opts ...LoadOption) error {
func Load(ctx context.Context, cs []Config, opts ...options.Option) error {
var err error
for _, c := range cs {
if err = c.Init(); err != nil {

View File

@@ -22,43 +22,3 @@ func NewContext(ctx context.Context, c Config) context.Context {
}
return context.WithValue(ctx, configKey{}, c)
}
// SetOption returns a function to setup a context with given value
func SetOption(k, v interface{}) Option {
return func(o *Options) {
if o.Context == nil {
o.Context = context.Background()
}
o.Context = context.WithValue(o.Context, k, v)
}
}
// SetSaveOption returns a function to setup a context with given value
func SetSaveOption(k, v interface{}) SaveOption {
return func(o *SaveOptions) {
if o.Context == nil {
o.Context = context.Background()
}
o.Context = context.WithValue(o.Context, k, v)
}
}
// SetLoadOption returns a function to setup a context with given value
func SetLoadOption(k, v interface{}) LoadOption {
return func(o *LoadOptions) {
if o.Context == nil {
o.Context = context.Background()
}
o.Context = context.WithValue(o.Context, k, v)
}
}
// SetWatchOption returns a function to setup a context with given value
func SetWatchOption(k, v interface{}) WatchOption {
return func(o *WatchOptions) {
if o.Context == nil {
o.Context = context.Background()
}
o.Context = context.WithValue(o.Context, k, v)
}
}

View File

@@ -40,47 +40,3 @@ func TestNewContext(t *testing.T) {
t.Fatal("NewContext not works")
}
}
func TestSetOption(t *testing.T) {
type key struct{}
o := SetOption(key{}, "test")
opts := &Options{}
o(opts)
if v, ok := opts.Context.Value(key{}).(string); !ok || v == "" {
t.Fatal("SetOption not works")
}
}
func TestSetSaveOption(t *testing.T) {
type key struct{}
o := SetSaveOption(key{}, "test")
opts := &SaveOptions{}
o(opts)
if v, ok := opts.Context.Value(key{}).(string); !ok || v == "" {
t.Fatal("SetSaveOption not works")
}
}
func TestSetLoadOption(t *testing.T) {
type key struct{}
o := SetLoadOption(key{}, "test")
opts := &LoadOptions{}
o(opts)
if v, ok := opts.Context.Value(key{}).(string); !ok || v == "" {
t.Fatal("SetLoadOption not works")
}
}
func TestSetWatchOption(t *testing.T) {
type key struct{}
o := SetWatchOption(key{}, "test")
opts := &WatchOptions{}
o(opts)
if v, ok := opts.Context.Value(key{}).(string); !ok || v == "" {
t.Fatal("SetWatchOption not works")
}
}

View File

@@ -9,6 +9,7 @@ import (
"github.com/google/uuid"
"github.com/imdario/mergo"
"go.unistack.org/micro/v4/options"
mid "go.unistack.org/micro/v4/util/id"
rutil "go.unistack.org/micro/v4/util/reflect"
mtime "go.unistack.org/micro/v4/util/time"
@@ -22,7 +23,7 @@ func (c *defaultConfig) Options() Options {
return c.opts
}
func (c *defaultConfig) Init(opts ...Option) error {
func (c *defaultConfig) Init(opts ...options.Option) error {
for _, o := range opts {
o(&c.opts)
}
@@ -38,7 +39,7 @@ func (c *defaultConfig) Init(opts ...Option) error {
return nil
}
func (c *defaultConfig) Load(ctx context.Context, opts ...LoadOption) error {
func (c *defaultConfig) Load(ctx context.Context, opts ...options.Option) error {
if err := DefaultBeforeLoad(ctx, c); err != nil && !c.opts.AllowFail {
return err
}
@@ -291,7 +292,7 @@ func fillValues(valueOf reflect.Value, tname string) error {
return nil
}
func (c *defaultConfig) Save(ctx context.Context, opts ...SaveOption) error {
func (c *defaultConfig) Save(ctx context.Context, opts ...options.Option) error {
if err := DefaultBeforeSave(ctx, c); err != nil {
return err
}
@@ -311,12 +312,12 @@ func (c *defaultConfig) Name() string {
return c.opts.Name
}
func (c *defaultConfig) Watch(ctx context.Context, opts ...WatchOption) (Watcher, error) {
func (c *defaultConfig) Watch(ctx context.Context, opts ...options.Option) (Watcher, error) {
return nil, ErrWatcherNotImplemented
}
// NewConfig returns new default config source
func NewConfig(opts ...Option) Config {
func NewConfig(opts ...options.Option) Config {
options := NewOptions(opts...)
if len(options.StructTag) == 0 {
options.StructTag = "default"

View File

@@ -7,6 +7,7 @@ import (
"go.unistack.org/micro/v4/codec"
"go.unistack.org/micro/v4/logger"
"go.unistack.org/micro/v4/meter"
"go.unistack.org/micro/v4/options"
"go.unistack.org/micro/v4/tracer"
)
@@ -44,11 +45,8 @@ type Options struct {
AllowFail bool
}
// Option function signature
type Option func(o *Options)
// NewOptions new options struct with filed values
func NewOptions(opts ...Option) Options {
func NewOptions(opts ...options.Option) Options {
options := Options{
Logger: logger.DefaultLogger,
Meter: meter.DefaultMeter,
@@ -62,9 +60,6 @@ func NewOptions(opts ...Option) Options {
return options
}
// LoadOption function signature
type LoadOption func(o *LoadOptions)
// LoadOptions struct
type LoadOptions struct {
Struct interface{}
@@ -74,7 +69,7 @@ type LoadOptions struct {
}
// NewLoadOptions create LoadOptions struct with provided opts
func NewLoadOptions(opts ...LoadOption) LoadOptions {
func NewLoadOptions(opts ...options.Option) LoadOptions {
options := LoadOptions{}
for _, o := range opts {
o(&options)
@@ -83,44 +78,27 @@ func NewLoadOptions(opts ...LoadOption) LoadOptions {
}
// LoadOverride override values when load
func LoadOverride(b bool) LoadOption {
return func(o *LoadOptions) {
o.Override = b
func LoadOverride(b bool) options.Option {
return func(src interface{}) error {
return options.Set(src, b, ".Override")
}
}
// LoadAppend override values when load
func LoadAppend(b bool) LoadOption {
return func(o *LoadOptions) {
o.Append = b
func LoadAppend(b bool) options.Option {
return func(src interface{}) error {
return options.Set(src, b, ".Append")
}
}
// LoadStruct override struct for loading
func LoadStruct(src interface{}) LoadOption {
return func(o *LoadOptions) {
o.Struct = src
}
}
// SaveOption function signature
type SaveOption func(o *SaveOptions)
// SaveOptions struct
type SaveOptions struct {
Struct interface{}
Context context.Context
}
// SaveStruct override struct for save to config
func SaveStruct(src interface{}) SaveOption {
return func(o *SaveOptions) {
o.Struct = src
}
}
// NewSaveOptions fill SaveOptions struct
func NewSaveOptions(opts ...SaveOption) SaveOptions {
func NewSaveOptions(opts ...options.Option) SaveOptions {
options := SaveOptions{}
for _, o := range opts {
o(&options)
@@ -129,100 +107,65 @@ func NewSaveOptions(opts ...SaveOption) SaveOptions {
}
// AllowFail allows config source to fail
func AllowFail(b bool) Option {
return func(o *Options) {
o.AllowFail = b
func AllowFail(b bool) options.Option {
return func(src interface{}) error {
return options.Set(src, b, ".AllowFail")
}
}
// BeforeInit run funcs before config Init
func BeforeInit(fn ...func(context.Context, Config) error) Option {
return func(o *Options) {
o.BeforeInit = fn
func BeforeInit(fn ...func(context.Context, Config) error) options.Option {
return func(src interface{}) error {
return options.Set(src, fn, ".BeforeInit")
}
}
// AfterInit run funcs after config Init
func AfterInit(fn ...func(context.Context, Config) error) Option {
return func(o *Options) {
o.AfterInit = fn
func AfterInit(fn ...func(context.Context, Config) error) options.Option {
return func(src interface{}) error {
return options.Set(src, fn, ".AfterInit")
}
}
// BeforeLoad run funcs before config load
func BeforeLoad(fn ...func(context.Context, Config) error) Option {
return func(o *Options) {
o.BeforeLoad = fn
func BeforeLoad(fn ...func(context.Context, Config) error) options.Option {
return func(src interface{}) error {
return options.Set(src, fn, ".BeforeLoad")
}
}
// AfterLoad run funcs after config load
func AfterLoad(fn ...func(context.Context, Config) error) Option {
return func(o *Options) {
o.AfterLoad = fn
func AfterLoad(fn ...func(context.Context, Config) error) options.Option {
return func(src interface{}) error {
return options.Set(src, fn, ".AfterLoad")
}
}
// BeforeSave run funcs before save
func BeforeSave(fn ...func(context.Context, Config) error) Option {
return func(o *Options) {
o.BeforeSave = fn
func BeforeSave(fn ...func(context.Context, Config) error) options.Option {
return func(src interface{}) error {
return options.Set(src, fn, ".BeforeSave")
}
}
// AfterSave run fncs after save
func AfterSave(fn ...func(context.Context, Config) error) Option {
return func(o *Options) {
o.AfterSave = fn
}
}
// Context pass context
func Context(ctx context.Context) Option {
return func(o *Options) {
o.Context = ctx
}
}
// Codec sets the source codec
func Codec(c codec.Codec) Option {
return func(o *Options) {
o.Codec = c
}
}
// Logger sets the logger
func Logger(l logger.Logger) Option {
return func(o *Options) {
o.Logger = l
}
}
// Tracer to be used for tracing
func Tracer(t tracer.Tracer) Option {
return func(o *Options) {
o.Tracer = t
func AfterSave(fn ...func(context.Context, Config) error) options.Option {
return func(src interface{}) error {
return options.Set(src, fn, ".AfterSave")
}
}
// Struct used as config
func Struct(v interface{}) Option {
return func(o *Options) {
o.Struct = v
func Struct(v interface{}) options.Option {
return func(src interface{}) error {
return options.Set(src, v, ".Struct")
}
}
// StructTag sets the struct tag that used for filling
func StructTag(name string) Option {
return func(o *Options) {
o.StructTag = name
}
}
// Name sets the name
func Name(n string) Option {
return func(o *Options) {
o.Name = n
func StructTag(name string) options.Option {
return func(src interface{}) error {
return options.Set(src, name, ".StructTag")
}
}
@@ -240,11 +183,8 @@ type WatchOptions struct {
Coalesce bool
}
// WatchOption func signature
type WatchOption func(*WatchOptions)
// NewWatchOptions create WatchOptions struct with provided opts
func NewWatchOptions(opts ...WatchOption) WatchOptions {
func NewWatchOptions(opts ...options.Option) WatchOptions {
options := WatchOptions{
Context: context.Background(),
MinInterval: DefaultWatcherMinInterval,
@@ -256,31 +196,20 @@ func NewWatchOptions(opts ...WatchOption) WatchOptions {
return options
}
// WatchContext pass context
func WatchContext(ctx context.Context) WatchOption {
return func(o *WatchOptions) {
o.Context = ctx
}
}
// WatchCoalesce controls watch event combining
func WatchCoalesce(b bool) WatchOption {
return func(o *WatchOptions) {
o.Coalesce = b
// Coalesce controls watch event combining
func Coalesce(b bool) options.Option {
return func(src interface{}) error {
return options.Set(src, b, ".Coalesce")
}
}
// WatchInterval specifies min and max time.Duration for pulling changes
func WatchInterval(min, max time.Duration) WatchOption {
return func(o *WatchOptions) {
o.MinInterval = min
o.MaxInterval = max
}
}
// WatchStruct overrides struct for fill
func WatchStruct(src interface{}) WatchOption {
return func(o *WatchOptions) {
o.Struct = src
func WatchInterval(min, max time.Duration) options.Option {
return func(src interface{}) error {
var err error
if err = options.Set(src, min, ".MinInterval"); err == nil {
err = options.Set(src, max, ".MaxInterval")
}
return err
}
}