// Package jsonencoding defines common types with JSON marshalers. package jsonencoding import ( "bytes" "fmt" "strconv" "time" ) // Duration adds text/json (un)marshaling functions to time.Duration. type Duration struct { time.Duration } // MarshalText writes d as text. func (d Duration) MarshalText() ([]byte, error) { return []byte(d.String()), nil } // UnmarshalText read d from a text representation. func (d *Duration) UnmarshalText(b []byte) error { s := string(bytes.TrimSpace(b)) f, err := strconv.ParseFloat(s, 64) if err == nil { d.Duration = time.Duration(f) return nil } d.Duration, err = time.ParseDuration(s) if err != nil { return fmt.Errorf("invalid duration %s: %w", s, err) } return nil }