|
|
|
@ -163,6 +163,8 @@ func (t *Time) UnmarshalJSON(b []byte) error {
|
|
|
|
|
// This type should not propagate beyond the scope of input/output processing.
|
|
|
|
|
type Duration time.Duration
|
|
|
|
|
|
|
|
|
|
var durationRE = regexp.MustCompile("^([0-9]+)(d|h|m|s|ms)$")
|
|
|
|
|
|
|
|
|
|
// StringToDuration parses a string into a time.Duration, assuming that a year
|
|
|
|
|
// a day always has 24h.
|
|
|
|
|
func ParseDuration(durationStr string) (Duration, error) {
|
|
|
|
@ -170,44 +172,51 @@ func ParseDuration(durationStr string) (Duration, error) {
|
|
|
|
|
if len(matches) != 3 {
|
|
|
|
|
return 0, fmt.Errorf("not a valid duration string: %q", durationStr)
|
|
|
|
|
}
|
|
|
|
|
durSeconds, _ := strconv.Atoi(matches[1])
|
|
|
|
|
dur := time.Duration(durSeconds) * time.Second
|
|
|
|
|
unit := matches[2]
|
|
|
|
|
switch unit {
|
|
|
|
|
var (
|
|
|
|
|
n, _ = strconv.Atoi(matches[1])
|
|
|
|
|
dur = time.Duration(n) * time.Millisecond
|
|
|
|
|
)
|
|
|
|
|
switch unit := matches[2]; unit {
|
|
|
|
|
case "d":
|
|
|
|
|
dur *= 60 * 60 * 24
|
|
|
|
|
dur *= 1000 * 60 * 60 * 24
|
|
|
|
|
case "h":
|
|
|
|
|
dur *= 60 * 60
|
|
|
|
|
dur *= 1000 * 60 * 60
|
|
|
|
|
case "m":
|
|
|
|
|
dur *= 60
|
|
|
|
|
dur *= 1000 * 60
|
|
|
|
|
case "s":
|
|
|
|
|
dur *= 1
|
|
|
|
|
dur *= 1000
|
|
|
|
|
case "ms":
|
|
|
|
|
// Value already correct
|
|
|
|
|
default:
|
|
|
|
|
return 0, fmt.Errorf("invalid time unit in duration string: %q", unit)
|
|
|
|
|
}
|
|
|
|
|
return Duration(dur), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var durationRE = regexp.MustCompile("^([0-9]+)([ywdhms]+)$")
|
|
|
|
|
|
|
|
|
|
func (d Duration) String() string {
|
|
|
|
|
seconds := int64(time.Duration(d) / time.Second)
|
|
|
|
|
var (
|
|
|
|
|
ms = int64(time.Duration(d) / time.Millisecond)
|
|
|
|
|
unit = "ms"
|
|
|
|
|
)
|
|
|
|
|
factors := map[string]int64{
|
|
|
|
|
"d": 60 * 60 * 24,
|
|
|
|
|
"h": 60 * 60,
|
|
|
|
|
"m": 60,
|
|
|
|
|
"s": 1,
|
|
|
|
|
"d": 1000 * 60 * 60 * 24,
|
|
|
|
|
"h": 1000 * 60 * 60,
|
|
|
|
|
"m": 1000 * 60,
|
|
|
|
|
"s": 1000,
|
|
|
|
|
"ms": 1,
|
|
|
|
|
}
|
|
|
|
|
unit := "s"
|
|
|
|
|
|
|
|
|
|
switch int64(0) {
|
|
|
|
|
case seconds % factors["d"]:
|
|
|
|
|
case ms % factors["d"]:
|
|
|
|
|
unit = "d"
|
|
|
|
|
case seconds % factors["h"]:
|
|
|
|
|
case ms % factors["h"]:
|
|
|
|
|
unit = "h"
|
|
|
|
|
case seconds % factors["m"]:
|
|
|
|
|
case ms % factors["m"]:
|
|
|
|
|
unit = "m"
|
|
|
|
|
case ms % factors["s"]:
|
|
|
|
|
unit = "s"
|
|
|
|
|
}
|
|
|
|
|
return fmt.Sprintf("%v%v", seconds/factors[unit], unit)
|
|
|
|
|
return fmt.Sprintf("%v%v", ms/factors[unit], unit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MarshalYAML implements the yaml.Marshaler interface.
|
|
|
|
|