git.zd.zone/hrpc/hrpc@v0.0.12/types/duration.go (about) 1 package types 2 3 import ( 4 "bytes" 5 "database/sql/driver" 6 "errors" 7 "reflect" 8 "time" 9 ) 10 11 // Duration can be used for "ns", "us" (or "µs"), "ms", "s", "m", "h" suffixs 12 type Duration struct { 13 time.Duration 14 } 15 16 // UnmarshalJSON for implementing the Unmarshaler interface 17 func (d *Duration) UnmarshalJSON(data []byte) error { 18 duration, err := time.ParseDuration(string(bytes.Trim(data, "\""))) 19 if err != nil { 20 return err 21 } 22 *d = Duration{duration} 23 return nil 24 } 25 26 func (d Duration) MarshalJSON() ([]byte, error) { 27 return []byte("\"" + d.String() + "\""), nil 28 } 29 30 func (d Duration) Value() (driver.Value, error) { 31 return d.String(), nil 32 } 33 34 func (d *Duration) Scan(src interface{}) error { 35 v, ok := src.([]byte) 36 if !ok { 37 return errors.New( 38 "bad []byte type assertion, got name: " + reflect.TypeOf(src).Name() + " kind: " + reflect.TypeOf(src).Kind().String(), 39 ) 40 } 41 d1, err := time.ParseDuration(string(v)) 42 if err != nil { 43 return err 44 } 45 *d = Duration{d1} 46 return nil 47 }