2020-05-05 02:09:10 +08:00
|
|
|
package config
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"strconv"
|
|
|
|
|
"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 {
|
2020-05-05 02:09:10 +08:00
|
|
|
var err error
|
|
|
|
|
b = bytes.Trim(b, `'`)
|
|
|
|
|
|
|
|
|
|
// see if we can directly convert it
|
|
|
|
|
dur, err := time.ParseDuration(string(b))
|
|
|
|
|
if err == nil {
|
2020-07-22 01:06:33 +08:00
|
|
|
*d = Duration(dur)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Parse string duration, ie, "1s"
|
|
|
|
|
if uq, err := strconv.Unquote(string(b)); err == nil && len(uq) > 0 {
|
|
|
|
|
dur, err := time.ParseDuration(uq)
|
|
|
|
|
if err == nil {
|
2020-07-22 01:06:33 +08:00
|
|
|
*d = Duration(dur)
|
2020-05-05 02:09:10 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// First try parsing as integer seconds
|
|
|
|
|
sI, err := strconv.ParseInt(string(b), 10, 64)
|
|
|
|
|
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
|
|
|
|
|
sF, err := strconv.ParseFloat(string(b), 64)
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
}
|