package config import ( "encoding/json" "fmt" "time" ) // Duration is a wrapper around time.Duration (used for better user experience) type Duration time.Duration func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { var v interface{} if err := unmarshal(&v); err != nil { return err } switch value := v.(type) { case string: tmp, err := time.ParseDuration(value) if err != nil { return err } *d = Duration(tmp) return nil case float64: return nil default: return fmt.Errorf("invalid duration %v", value) } } func (d *Duration) UnmarshalJSON(b []byte) error { var v interface{} if err := json.Unmarshal(b, &v); err != nil { return err } switch value := v.(type) { case string: tmp, err := time.ParseDuration(value) if err != nil { return err } *d = Duration(tmp) return nil case float64: return nil default: return fmt.Errorf("invalid duration %v", value) } } func (d *Duration) Get() time.Duration { return time.Duration(*d) }