Skip to content

Commit

Permalink
Merge pull request #182 from unistack-org/timeDuration
Browse files Browse the repository at this point in the history
config/default: handle time.Duration
  • Loading branch information
vtolstov authored Feb 7, 2023
2 parents 453d223 + 8159b9d commit 7c29afb
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 8 deletions.
26 changes: 22 additions & 4 deletions config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import (
"reflect"
"strconv"
"strings"
"time"

"github.com/imdario/mergo"
rutil "go.unistack.org/micro/v3/util/reflect"
mtime "go.unistack.org/micro/v3/util/time"
)

type defaultConfig struct {
Expand Down Expand Up @@ -75,6 +77,7 @@ func fillValue(value reflect.Value, val string) error {
if !rutil.IsEmpty(value) {
return nil
}

switch value.Kind() {
case reflect.Map:
t := value.Type()
Expand Down Expand Up @@ -151,11 +154,26 @@ func fillValue(value reflect.Value, val string) error {
}
value.Set(reflect.ValueOf(int32(v)))
case reflect.Int64:
v, err := strconv.ParseInt(val, 10, 64)
if err != nil {
return err
switch {
case value.Type().String() == "time.Duration" && value.Type().PkgPath() == "time":
v, err := time.ParseDuration(val)
if err != nil {
return err
}
value.Set(reflect.ValueOf(v))
case value.Type().String() == "time.Duration" && value.Type().PkgPath() == "go.unistack.org/micro/v3/util/time":
v, err := mtime.ParseDuration(val)
if err != nil {
return err
}
value.SetInt(int64(v))
default:
v, err := strconv.ParseInt(val, 10, 64)
if err != nil {
return err
}
value.Set(reflect.ValueOf(v))
}
value.Set(reflect.ValueOf(v))
case reflect.Uint:
v, err := strconv.ParseUint(val, 10, 0)
if err != nil {
Expand Down
12 changes: 8 additions & 4 deletions config/default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@ import (
"context"
"fmt"
"testing"
"time"

"go.unistack.org/micro/v3/config"
mtime "go.unistack.org/micro/v3/util/time"
)

type cfg struct {
StringValue string `default:"string_value"`
IgnoreValue string `json:"-"`
StructValue *cfgStructValue
IntValue int `default:"99"`
StringValue string `default:"string_value"`
IgnoreValue string `json:"-"`
StructValue *cfgStructValue
IntValue int `default:"99"`
DurationValue time.Duration `default:"10s"`
MDurationValue mtime.Duration `default:"10s"`
}

type cfgStructValue struct {
Expand Down
48 changes: 48 additions & 0 deletions util/time/duration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package time

import (
"fmt"
"time"
)

type Duration int64

func ParseDuration(s string) (time.Duration, error) {
if s == "" {
return 0, fmt.Errorf(`time: invalid duration "` + s + `"`)
}

//var sb strings.Builder
/*
for i, r := range s {
switch r {
case 'd':
n, err := strconv.Atoi(s[idx:i])
if err != nil {
return 0, errors.New("time: invalid duration " + s)
}
s[idx:i] = fmt.Sprintf("%d", n*24)
default:
sb.WriteRune(r)
}
}
*/
var td time.Duration
var err error
switch s[len(s)-1] {
case 's', 'm', 'h':
td, err = time.ParseDuration(s)
case 'd':
if td, err = time.ParseDuration(s[:len(s)-1] + "h"); err == nil {
td *= 24
}
case 'y':
if td, err = time.ParseDuration(s[:len(s)-1] + "h"); err == nil {
year := time.Date(time.Now().Year(), time.December, 31, 0, 0, 0, 0, time.Local)
days := year.YearDay()
td *= 24 * time.Duration(days)
}
}

return td, err
}
27 changes: 27 additions & 0 deletions util/time/duration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package time

import (
"testing"
"time"
)

func TestParseDuration(t *testing.T) {
var td time.Duration
var err error
t.Skip()
td, err = ParseDuration("14d4h")
if err != nil {
t.Fatalf("ParseDuration error: %v", err)
}
if td.String() != "336h0m0s" {
t.Fatalf("ParseDuration 14d != 336h0m0s : %s", td.String())
}

td, err = ParseDuration("1y")
if err != nil {
t.Fatalf("ParseDuration error: %v", err)
}
if td.String() != "8760h0m0s" {
t.Fatalf("ParseDuration 1y != 8760h0m0s : %s", td.String())
}
}

0 comments on commit 7c29afb

Please sign in to comment.