package service import ( "math/rand" "time" ) type Duration struct { time.Duration } func DurationRef(v time.Duration) *Duration { return &Duration{v} } func (s Duration) MarshalText() ([]byte, error) { return []byte(s.Duration.String()), nil } func (s *Duration) Max(args ...*Duration) Duration { m := s for _, o := range args { if m.Duration < o.Duration { v := o m = v } } return *m } func (s *Duration) Min(args ...*Duration) Duration { m := s for _, o := range args { if m.Duration > o.Duration { v := o m = v } } return *m } func (s *Duration) UnmarshalText(text []byte) error { v, err := time.ParseDuration(string(text)) if err != nil { return err } *s = Duration{v} return nil } func RandomDuration(from Duration, until Duration) Duration { period := until.Duration - from.Duration return Duration{from.Duration + time.Duration(rand.Intn(int(period)))} }