feat(config): Accept durations given in days (e.g. "7d") (#12579)
This commit is contained in:
parent
8896538f5d
commit
9dfbbb29ae
|
|
@ -1,12 +1,18 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/alecthomas/units"
|
||||
)
|
||||
|
||||
// Regexp for day specifications in durations
|
||||
var durationDayRe = regexp.MustCompile(`(\d+(?:\.\d+)?)d`)
|
||||
|
||||
// Duration is a time.Duration
|
||||
type Duration time.Duration
|
||||
|
||||
|
|
@ -36,13 +42,18 @@ func (d *Duration) UnmarshalText(b []byte) error {
|
|||
|
||||
// Finally, try value is a TOML string (e.g. "3s", 3s) or literal (e.g. '3s')
|
||||
if durStr == "" {
|
||||
durStr = "0s"
|
||||
*d = Duration(0)
|
||||
return nil
|
||||
}
|
||||
// special case: logging interval had a default of 0d, which silently
|
||||
// failed, but in order to prevent issues with default configs that had
|
||||
// uncommented the option, change it from zero days to zero hours.
|
||||
if durStr == "0d" {
|
||||
durStr = "0h"
|
||||
|
||||
// Handle "day" intervals and replace them with the "hours" equivalent
|
||||
for _, m := range durationDayRe.FindAllStringSubmatch(durStr, -1) {
|
||||
days, err := strconv.ParseFloat(m[1], 64)
|
||||
if err != nil {
|
||||
return fmt.Errorf("converting %q to hours failed: %w", durStr, err)
|
||||
}
|
||||
hours := strconv.FormatFloat(days*24, 'f', -1, 64) + "h"
|
||||
durStr = strings.Replace(durStr, m[0], hours, 1)
|
||||
}
|
||||
|
||||
dur, err := time.ParseDuration(durStr)
|
||||
|
|
|
|||
|
|
@ -91,7 +91,12 @@ func TestTOMLParsingStringDurations(t *testing.T) {
|
|||
"42m",
|
||||
"100ms",
|
||||
"100us",
|
||||
"100ns"
|
||||
"100ns",
|
||||
"1d",
|
||||
"7.5d",
|
||||
"7d8h15m",
|
||||
"3d7d",
|
||||
"15m8h3.5d"
|
||||
]
|
||||
`)
|
||||
|
||||
|
|
@ -107,6 +112,11 @@ func TestTOMLParsingStringDurations(t *testing.T) {
|
|||
100 * time.Millisecond,
|
||||
100 * time.Microsecond,
|
||||
100 * time.Nanosecond,
|
||||
24 * time.Hour,
|
||||
7*24*time.Hour + 12*time.Hour,
|
||||
7*24*time.Hour + 8*time.Hour + 15*time.Minute,
|
||||
10 * 24 * time.Hour,
|
||||
3*24*time.Hour + 12*time.Hour + 8*time.Hour + 15*time.Minute,
|
||||
}
|
||||
|
||||
// Load the data
|
||||
|
|
|
|||
Loading…
Reference in New Issue