5 changed files with 300 additions and 0 deletions
@ -0,0 +1,172 @@ |
|||||
|
package config_test |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"log" |
||||
|
"os" |
||||
|
"sync" |
||||
|
"time" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/config" |
||||
|
"gitoa.ru/go-4devs/config/provider/arg" |
||||
|
"gitoa.ru/go-4devs/config/provider/env" |
||||
|
"gitoa.ru/go-4devs/config/provider/watcher" |
||||
|
"gitoa.ru/go-4devs/config/test" |
||||
|
) |
||||
|
|
||||
|
func ExampleClient_Value() { |
||||
|
ctx := context.Background() |
||||
|
_ = os.Setenv("FDEVS_CONFIG_LISTEN", "8080") |
||||
|
_ = os.Setenv("FDEVS_CONFIG_HOST", "localhost") |
||||
|
|
||||
|
args := os.Args |
||||
|
|
||||
|
defer func() { |
||||
|
os.Args = args |
||||
|
}() |
||||
|
|
||||
|
os.Args = []string{"main.go", "--host=gitoa.ru"} |
||||
|
|
||||
|
// read json config
|
||||
|
|
||||
|
config, err := config.New( |
||||
|
arg.New(), |
||||
|
env.New(test.Namespace, test.AppName), |
||||
|
) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
port, err := config.Value(ctx, "listen") |
||||
|
if err != nil { |
||||
|
log.Print("listen", err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
hostValue, err := config.Value(ctx, "host") |
||||
|
if err != nil { |
||||
|
log.Print("host ", err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
fmt.Printf("listen from env: %d\n", port.Int()) |
||||
|
fmt.Printf("replace env host by args: %v\n", hostValue.String()) |
||||
|
// Output:
|
||||
|
// listen from env: 8080
|
||||
|
// replace env host by args: gitoa.ru
|
||||
|
} |
||||
|
|
||||
|
func ExampleClient_Watch() { |
||||
|
ctx, cancel := context.WithCancel(context.Background()) |
||||
|
defer cancel() |
||||
|
|
||||
|
_ = os.Setenv("FDEVS_CONFIG_EXAMPLE_ENABLE", "true") |
||||
|
|
||||
|
watcher, err := config.New( |
||||
|
watcher.New(time.Microsecond, env.New(test.Namespace, test.AppName)), |
||||
|
) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
wg := sync.WaitGroup{} |
||||
|
wg.Add(1) |
||||
|
|
||||
|
err = watcher.Watch(ctx, func(ctx context.Context, oldVar, newVar config.Value) error { |
||||
|
fmt.Println("update example_enable old: ", oldVar.Bool(), " new:", newVar.Bool()) |
||||
|
wg.Done() |
||||
|
return nil |
||||
|
}, "example_enable") |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
_ = os.Setenv("FDEVS_CONFIG_EXAMPLE_ENABLE", "false") |
||||
|
|
||||
|
err = watcher.Watch(ctx, func(ctx context.Context, oldVar, newVar config.Value) error { |
||||
|
fmt.Println("update example_db_dsn old: ", oldVar.String(), " new:", newVar.String()) |
||||
|
wg.Done() |
||||
|
return nil |
||||
|
}, "example_db_dsn") |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
wg.Wait() |
||||
|
|
||||
|
// Output:
|
||||
|
// update example_enable old: true new: false
|
||||
|
} |
||||
|
|
||||
|
func ExampleClient_Value_factory() { |
||||
|
ctx := context.Background() |
||||
|
_ = os.Setenv("FDEVS_CONFIG_LISTEN", "8080") |
||||
|
_ = os.Setenv("FDEVS_CONFIG_HOST", "localhost") |
||||
|
_ = os.Setenv("FDEVS_GOLANG_HOST", "go.dev") |
||||
|
|
||||
|
args := os.Args |
||||
|
|
||||
|
defer func() { |
||||
|
os.Args = args |
||||
|
}() |
||||
|
|
||||
|
os.Args = []string{"main.go", "--env=golang"} |
||||
|
|
||||
|
config, err := config.New( |
||||
|
arg.New(), |
||||
|
config.Factory(func(ctx context.Context, cfg config.Provider) (config.Provider, error) { |
||||
|
val, err := cfg.Value(ctx, "env") |
||||
|
if err != nil { |
||||
|
return nil, fmt.Errorf("failed read config file:%w", err) |
||||
|
} |
||||
|
|
||||
|
return env.New(test.Namespace, val.String()), nil |
||||
|
}), |
||||
|
env.New(test.Namespace, test.AppName), |
||||
|
) |
||||
|
if err != nil { |
||||
|
log.Print(err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
envName, err := config.Value(ctx, "env") |
||||
|
if err != nil { |
||||
|
log.Print("env ", err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
host, err := config.Value(ctx, "host") |
||||
|
if err != nil { |
||||
|
log.Print("host ", err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
listen, err := config.Value(ctx, "listen") |
||||
|
if err != nil { |
||||
|
log.Print("listen", err) |
||||
|
|
||||
|
return |
||||
|
} |
||||
|
|
||||
|
fmt.Printf("envName from env: %s\n", envName.String()) |
||||
|
fmt.Printf("host from env with app name golang: %s\n", host.String()) |
||||
|
fmt.Printf("listen from env with default app name: %s\n", listen.String()) |
||||
|
// Output:
|
||||
|
// envName from env: golang
|
||||
|
// host from env with app name golang: go.dev
|
||||
|
// listen from env with default app name: 8080
|
||||
|
} |
@ -0,0 +1,32 @@ |
|||||
|
package definition |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/sirupsen/logrus" |
||||
|
"gitoa.ru/go-4devs/config/definition" |
||||
|
"gitoa.ru/go-4devs/config/definition/group" |
||||
|
"gitoa.ru/go-4devs/config/definition/option" |
||||
|
"gitoa.ru/go-4devs/config/definition/proto" |
||||
|
"gitoa.ru/go-4devs/log/level" |
||||
|
) |
||||
|
|
||||
|
func Configure(ctx context.Context, def *definition.Definition) error { |
||||
|
def.Add( |
||||
|
option.String("test", "test description", option.Default("defult")), |
||||
|
option.Int("int", "test int description", option.Default(2)), |
||||
|
group.New("group", "group description", option.String("test", "test description")), |
||||
|
option.Time("start", "start at", option.Default(time.Now())), |
||||
|
option.Duration("timer", "timer", option.Default(time.Hour)), |
||||
|
group.New("log", "logger", |
||||
|
option.New("level", "log level", level.Level(0), option.Default(level.Debug)), |
||||
|
option.New("logrus", "logrus level", logrus.Level(0), option.Default(logrus.DebugLevel)), |
||||
|
proto.New("sevice", "cutom service log", option.New("level", "log level", level.Level(0), option.Default(level.Debug))), |
||||
|
), |
||||
|
option.New("erors", "skiped errors", []string{}), |
||||
|
proto.New("proto_errors", "proto errors", option.New("erors", "skiped errors", []string{})), |
||||
|
) |
||||
|
|
||||
|
return nil |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
//go:build ignore
|
||||
|
// +build ignore
|
||||
|
|
||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"go/format" |
||||
|
"os" |
||||
|
|
||||
|
"gitoa.ru/go-4devs/config/definition" |
||||
|
"gitoa.ru/go-4devs/config/definition/generate" |
||||
|
"gitoa.ru/go-4devs/config/eample" |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
if err := run(); err != nil { |
||||
|
fmt.Fprintln(os.Stdout, err) |
||||
|
os.Exit(1) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func run() error { |
||||
|
ctx := context.Background() |
||||
|
def := definition.New() |
||||
|
if err := eample.Configure(ctx, &def); err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
f, err := os.Create("eample/defenition_input.go") |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
gerr := generate.Run(f, "eample", def, generate.ViewOption{ |
||||
|
Struct: "Configure", |
||||
|
Suffix: "Input", |
||||
|
Errors: generate.ViewErrors{ |
||||
|
Default: []string{ |
||||
|
"gitoa.ru/go-4devs/config.ErrVariableNotFound", |
||||
|
}, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
if gerr != nil { |
||||
|
return gerr |
||||
|
} |
||||
|
|
||||
|
in, err := os.ReadFile(f.Name()) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
out, err := format.Source(in) |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
return os.WriteFile(f.Name(), out, 0644) |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
module gitoa.ru/go-4devs/config/example |
||||
|
|
||||
|
go 1.21.5 |
||||
|
|
||||
|
require ( |
||||
|
github.com/sirupsen/logrus v1.9.3 |
||||
|
gitoa.ru/go-4devs/config/definition v0.0.0-20240125203435-5586adc4e3d8 |
||||
|
gitoa.ru/go-4devs/log v0.5.3 |
||||
|
) |
||||
|
|
||||
|
require ( |
||||
|
github.com/iancoleman/strcase v0.3.0 // indirect |
||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect |
||||
|
) |
@ -0,0 +1,21 @@ |
|||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
|
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= |
||||
|
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= |
||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= |
||||
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= |
||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= |
||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= |
||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
||||
|
gitoa.ru/go-4devs/config/definition v0.0.0-20240125203435-5586adc4e3d8 h1:PZ4SE0gq719+lXorGaRPfGSSO2JpfxTWCWOSsna+7Yw= |
||||
|
gitoa.ru/go-4devs/config/definition v0.0.0-20240125203435-5586adc4e3d8/go.mod h1:jV6jF0PsK4ffNC8hrBxMx33PVJtnW5O6S/sGNJDqrd4= |
||||
|
gitoa.ru/go-4devs/log v0.5.3 h1:o/4DcypxbgQ9GEfUWrZ3FVrVfttuJgLs2ptMVPj47sE= |
||||
|
gitoa.ru/go-4devs/log v0.5.3/go.mod h1:tREtjEH2cTHl0p3uCVcH9g5tlqtsVNI/tDQVfq53Ty4= |
||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= |
||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= |
||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
Loading…
Reference in new issue