2020-05-05 02:09:10 +08:00
|
|
|
package config
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strconv"
|
2022-03-11 23:15:04 +08:00
|
|
|
"strings"
|
2020-05-05 02:09:10 +08:00
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/alecthomas/units"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Duration is a time.Duration
|
|
|
|
|
type Duration time.Duration
|
|
|
|
|
|
|
|
|
|
// Size is an int64
|
|
|
|
|
type Size int64
|
|
|
|
|
|
|
|
|
|
// UnmarshalTOML parses the duration from the TOML config file
|
2020-07-22 01:06:33 +08:00
|
|
|
func (d *Duration) UnmarshalTOML(b []byte) error {
|
2022-03-11 23:15:04 +08:00
|
|
|
// convert to string
|
|
|
|
|
durStr := string(b)
|
2020-05-05 02:09:10 +08:00
|
|
|
|
2022-03-11 23:15:04 +08:00
|
|
|
// Value is a TOML number (e.g. 3, 10, 3.5)
|
2020-05-05 02:09:10 +08:00
|
|
|
// First try parsing as integer seconds
|
2022-03-11 23:15:04 +08:00
|
|
|
sI, err := strconv.ParseInt(durStr, 10, 64)
|
2020-05-05 02:09:10 +08:00
|
|
|
if err == nil {
|
|
|
|
|
dur := time.Second * time.Duration(sI)
|
2020-07-22 01:06:33 +08:00
|
|
|
*d = Duration(dur)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
// Second try parsing as float seconds
|
2022-03-11 23:15:04 +08:00
|
|
|
sF, err := strconv.ParseFloat(durStr, 64)
|
2020-05-05 02:09:10 +08:00
|
|
|
if err == nil {
|
|
|
|
|
dur := time.Second * time.Duration(sF)
|
2020-07-22 01:06:33 +08:00
|
|
|
*d = Duration(dur)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-11 23:15:04 +08:00
|
|
|
// Finally, try value is a TOML string (e.g. "3s", 3s) or literal (e.g. '3s')
|
|
|
|
|
durStr = strings.ReplaceAll(durStr, "'", "")
|
|
|
|
|
durStr = strings.ReplaceAll(durStr, "\"", "")
|
2022-03-16 21:18:27 +08:00
|
|
|
if durStr == "" {
|
|
|
|
|
durStr = "0s"
|
|
|
|
|
}
|
2022-03-30 05:05:10 +08:00
|
|
|
// 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"
|
|
|
|
|
}
|
2022-03-16 21:18:27 +08:00
|
|
|
|
2022-03-11 23:15:04 +08:00
|
|
|
dur, err := time.ParseDuration(durStr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*d = Duration(dur)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-19 02:20:31 +08:00
|
|
|
func (d *Duration) UnmarshalText(text []byte) error {
|
|
|
|
|
return d.UnmarshalTOML(text)
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-22 01:06:33 +08:00
|
|
|
func (s *Size) UnmarshalTOML(b []byte) error {
|
2020-05-05 02:09:10 +08:00
|
|
|
var err error
|
2020-08-19 02:20:31 +08:00
|
|
|
if len(b) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
str := string(b)
|
|
|
|
|
if b[0] == '"' || b[0] == '\'' {
|
|
|
|
|
str, err = strconv.Unquote(str)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-05-05 02:09:10 +08:00
|
|
|
|
2020-08-19 02:20:31 +08:00
|
|
|
val, err := strconv.ParseInt(str, 10, 64)
|
2020-05-05 02:09:10 +08:00
|
|
|
if err == nil {
|
2020-07-22 01:06:33 +08:00
|
|
|
*s = Size(val)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
2020-08-19 02:20:31 +08:00
|
|
|
val, err = units.ParseStrictBytes(str)
|
2020-05-05 02:09:10 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2020-07-22 01:06:33 +08:00
|
|
|
*s = Size(val)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-19 02:20:31 +08:00
|
|
|
func (s *Size) UnmarshalText(text []byte) error {
|
|
|
|
|
return s.UnmarshalTOML(text)
|
2020-05-05 02:09:10 +08:00
|
|
|
}
|