github.com/lyft/flytestdlib@v0.3.12-0.20210213045714-8cdd111ecda1/config/duration.go (about) 1 package config 2 3 import ( 4 "encoding/json" 5 "errors" 6 "time" 7 ) 8 9 // A wrapper around time.Duration that enables Json Marshalling capabilities 10 type Duration struct { 11 time.Duration 12 } 13 14 func (d Duration) MarshalJSON() ([]byte, error) { 15 return json.Marshal(d.String()) 16 } 17 18 func (d *Duration) UnmarshalJSON(b []byte) error { 19 if len(b) == 0 { 20 d.Duration = time.Duration(0) 21 return nil 22 } 23 24 var v interface{} 25 if err := json.Unmarshal(b, &v); err != nil { 26 return err 27 } 28 switch value := v.(type) { 29 case float64: 30 d.Duration = time.Duration(value) 31 return nil 32 case string: 33 if len(value) == 0 { 34 d.Duration = time.Duration(0) 35 } else { 36 var err error 37 d.Duration, err = time.ParseDuration(value) 38 if err != nil { 39 return err 40 } 41 } 42 default: 43 return errors.New("invalid duration") 44 } 45 46 return nil 47 }