From fc6c161d1346bb7a4bbfec7f936888716399f949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=91=D0=B0?= =?UTF-8?q?=D0=B4=D1=8F=D0=B5=D0=B2?= Date: Wed, 23 Oct 2024 14:47:10 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20time.Duration=20=D0=B2=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=D1=85=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .golangci.yaml | 2 +- .vscode/settings.json | 2 ++ config.go | 4 ++++ config_test.go | 2 ++ test/data.go | 15 +++++++++------ utils.go | 12 ++++++++++++ 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 5f9114a..c7972d8 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -64,7 +64,7 @@ linters: - interfacebloat - intrange - ireturn - - lll + # - lll - loggercheck - maintidx - makezero diff --git a/.vscode/settings.json b/.vscode/settings.json index ebf5a86..7918201 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ + "DEFVALUE", "errcheck", "eschao", "gitea", @@ -7,6 +8,7 @@ "gopkg", "honnef", "kisielk", + "nodefvalue", "sashamelentyev", "staticcheck", "stretchr", diff --git a/config.go b/config.go index a0b1abf..3a07a62 100644 --- a/config.go +++ b/config.go @@ -104,6 +104,10 @@ func parseValue(value reflect.Value) error { func setValue(value reflect.Value, defValue string, field reflect.StructField) error { var err error + if value.Type().PkgPath() == "time" && value.Type().Name() == "Duration" { + return SetValueWithDuration(value, defValue) + } + switch value.Kind() { case reflect.Bool: err = SetValueWithBool(value, defValue) diff --git a/config_test.go b/config_test.go index f7c075f..8a58315 100644 --- a/config_test.go +++ b/config_test.go @@ -21,6 +21,7 @@ import ( "runtime" "strconv" "testing" + "time" "git.mousesoft.ru/ms/config/test" "github.com/stretchr/testify/assert" @@ -39,6 +40,7 @@ func TestDefaultValueConfig(t *testing.T) { assert.Equal("xx", conf.SliceValue[0]) assert.Equal("yy", conf.SliceValue[1]) assert.Equal("zz", conf.SliceValue[2]) + assert.Equal(time.Second*15, conf.Interval) assert.Equal("", conf.NoDefValue) } diff --git a/test/data.go b/test/data.go index 7d07e2c..cd6af2b 100644 --- a/test/data.go +++ b/test/data.go @@ -15,6 +15,8 @@ */ package test +import "time" + type DBConfig struct { Host string `cli:"host" env:"HOST" json:"host" usage:"database server hostname" yaml:"host"` Port int `cli:"port" env:"PORT" json:"port" usage:"database server port" yaml:"port"` @@ -59,12 +61,13 @@ type TypesConfig struct { } type DefValueConfig struct { - BoolValue bool `cli:"bool" default:"true" env:"CONFIG_TEST_BOOL" usage:"boolean value"` - IntValue int `cli:"int" default:"123" env:"CONFIG_TEST_INT" usage:"int value"` - Float64Value float64 `cli:"float64" default:"123.4567" env:"CONFIG_TEST_FLOAT64" usage:"float64 value"` - StrValue string `cli:"str" default:"default-string" env:"CONFIG_TEST_STR" usage:"string value"` - SliceValue []string `cli:"slice" default:"xx:yy:zz" env:"CONFIG_TEST_SLICE" usage:"slice values"` - NoDefValue string `cli:"nodefvalue" env:"CONFIG_TEST_NO_DEFVALUE" usage:"no default value"` + BoolValue bool `cli:"bool" default:"true" env:"CONFIG_TEST_BOOL" usage:"boolean value"` + IntValue int `cli:"int" default:"123" env:"CONFIG_TEST_INT" usage:"int value"` + Float64Value float64 `cli:"float64" default:"123.4567" env:"CONFIG_TEST_FLOAT64" usage:"float64 value"` + StrValue string `cli:"str" default:"default-string" env:"CONFIG_TEST_STR" usage:"string value"` + SliceValue []string `cli:"slice" default:"xx:yy:zz" env:"CONFIG_TEST_SLICE" usage:"slice values"` + Interval time.Duration `cli:"interval" default:"15s" env:"CONFIG_TEST_INTERVAL" usage:"time duration"` + NoDefValue string `cli:"nodefvalue" env:"CONFIG_TEST_NO_DEFVALUE" usage:"no default value"` } type SlicesConfig struct { diff --git a/utils.go b/utils.go index 768f914..02dd95d 100644 --- a/utils.go +++ b/utils.go @@ -20,6 +20,7 @@ import ( "reflect" "strconv" "strings" + "time" ) func SetValueWithBool(value reflect.Value, boolValue string) error { @@ -33,6 +34,17 @@ func SetValueWithBool(value reflect.Value, boolValue string) error { return nil } +func SetValueWithDuration(value reflect.Value, str string) error { + d, err := time.ParseDuration(str) + if err != nil { + return fmt.Errorf("parse duration: %w", err) + } + + value.Set(reflect.ValueOf(d)) + + return nil +} + func SetValueWithFloatX(value reflect.Value, floatValue string, bitSize int) error { f, err := strconv.ParseFloat(floatValue, bitSize) if err != nil {