config/default: handle time.Duration #182
| @@ -5,9 +5,11 @@ import ( | |||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/imdario/mergo" | 	"github.com/imdario/mergo" | ||||||
| 	rutil "go.unistack.org/micro/v3/util/reflect" | 	rutil "go.unistack.org/micro/v3/util/reflect" | ||||||
|  | 	mtime "go.unistack.org/micro/v3/util/time" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type defaultConfig struct { | type defaultConfig struct { | ||||||
| @@ -75,6 +77,7 @@ func fillValue(value reflect.Value, val string) error { | |||||||
| 	if !rutil.IsEmpty(value) { | 	if !rutil.IsEmpty(value) { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch value.Kind() { | 	switch value.Kind() { | ||||||
| 	case reflect.Map: | 	case reflect.Map: | ||||||
| 		t := value.Type() | 		t := value.Type() | ||||||
| @@ -151,11 +154,26 @@ func fillValue(value reflect.Value, val string) error { | |||||||
| 		} | 		} | ||||||
| 		value.Set(reflect.ValueOf(int32(v))) | 		value.Set(reflect.ValueOf(int32(v))) | ||||||
| 	case reflect.Int64: | 	case reflect.Int64: | ||||||
| 		v, err := strconv.ParseInt(val, 10, 64) | 		switch { | ||||||
| 		if err != nil { | 		case value.Type().String() == "time.Duration" && value.Type().PkgPath() == "time": | ||||||
| 			return err | 			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: | 	case reflect.Uint: | ||||||
| 		v, err := strconv.ParseUint(val, 10, 0) | 		v, err := strconv.ParseUint(val, 10, 0) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|   | |||||||
| @@ -4,15 +4,19 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/config" | 	"go.unistack.org/micro/v3/config" | ||||||
|  | 	mtime "go.unistack.org/micro/v3/util/time" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type cfg struct { | type cfg struct { | ||||||
| 	StringValue string `default:"string_value"` | 	StringValue    string `default:"string_value"` | ||||||
| 	IgnoreValue string `json:"-"` | 	IgnoreValue    string `json:"-"` | ||||||
| 	StructValue *cfgStructValue | 	StructValue    *cfgStructValue | ||||||
| 	IntValue    int `default:"99"` | 	IntValue       int            `default:"99"` | ||||||
|  | 	DurationValue  time.Duration  `default:"10s"` | ||||||
|  | 	MDurationValue mtime.Duration `default:"10s"` | ||||||
| } | } | ||||||
|  |  | ||||||
| type cfgStructValue struct { | type cfgStructValue struct { | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								util/time/duration.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								util/time/duration.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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
									
								
								util/time/duration_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								util/time/duration_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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()) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user