diff options
Diffstat (limited to 'golang/pkg/api/duration.go')
-rw-r--r-- | golang/pkg/api/duration.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/golang/pkg/api/duration.go b/golang/pkg/api/duration.go new file mode 100644 index 0000000..c2ba1fd --- /dev/null +++ b/golang/pkg/api/duration.go @@ -0,0 +1,38 @@ +package api + +import ( + "encoding/json" + "errors" + "time" +) + +type Duration time.Duration + +func (d *Duration) Duration() time.Duration { + return time.Duration(*d) +} + +func (d *Duration) MarshalJSON() ([]byte, error) { + return json.Marshal(time.Duration(*d).String()) +} + +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 float64: + *d = Duration(time.Duration(value)) + return nil + case string: + tmp, err := time.ParseDuration(value) + if err != nil { + return err + } + *d = Duration(tmp) + return nil + default: + return errors.New("invalid duration") + } +} |