Browse Source
This allows to use human-readable durations with the API, for instance: "5s" instead of 5000000000pull/591/head
19 changed files with 242 additions and 147 deletions
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
package conf |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"errors" |
||||
"time" |
||||
|
||||
"gopkg.in/yaml.v2" |
||||
) |
||||
|
||||
// StringDuration is a duration that is unmarshaled from a string.
|
||||
// Durations are normally unmarshaled from numbers.
|
||||
type StringDuration time.Duration |
||||
|
||||
// MarshalJSON marshals a StringDuration into a string.
|
||||
func (d StringDuration) MarshalJSON() ([]byte, error) { |
||||
return json.Marshal(time.Duration(d).String()) |
||||
} |
||||
|
||||
// UnmarshalJSON unmarshals a StringDuration from a string.
|
||||
func (d *StringDuration) UnmarshalJSON(b []byte) error { |
||||
var v interface{} |
||||
if err := json.Unmarshal(b, &v); err != nil { |
||||
return err |
||||
} |
||||
|
||||
value, ok := v.(string) |
||||
if !ok { |
||||
return errors.New("invalid duration") |
||||
} |
||||
|
||||
du, err := time.ParseDuration(value) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
*d = StringDuration(du) |
||||
return nil |
||||
} |
||||
|
||||
// MarshalYAML marshals a StringDuration into a string.
|
||||
func (d StringDuration) MarshalYAML() ([]byte, error) { |
||||
return yaml.Marshal(time.Duration(d).String()) |
||||
} |
||||
|
||||
// UnmarshalYAML unmarshals a StringDuration from a string.
|
||||
func (d *StringDuration) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var v interface{} |
||||
if err := unmarshal(&v); err != nil { |
||||
return err |
||||
} |
||||
|
||||
value, ok := v.(string) |
||||
if !ok { |
||||
return errors.New("invalid duration") |
||||
} |
||||
|
||||
du, err := time.ParseDuration(value) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
*d = StringDuration(du) |
||||
return nil |
||||
} |
||||
Loading…
Reference in new issue