time.go (1077B)
1 package service 2 3 import ( 4 "math/rand" 5 "time" 6 ) 7 8 type Duration struct { 9 time.Duration 10 } 11 12 func DurationRef(v time.Duration) *Duration { 13 return &Duration{v} 14 } 15 16 func (s Duration) MarshalText() ([]byte, error) { 17 return []byte(s.Duration.String()), nil 18 } 19 20 func (s *Duration) Max(args ...*Duration) Duration { 21 m := s 22 23 for _, o := range args { 24 if m.Duration < o.Duration { 25 v := o 26 m = v 27 } 28 } 29 30 return *m 31 } 32 33 func (s *Duration) Min(args ...*Duration) Duration { 34 m := s 35 36 for _, o := range args { 37 if m.Duration > o.Duration { 38 v := o 39 m = v 40 } 41 } 42 43 return *m 44 } 45 46 func (s *Duration) UnmarshalText(text []byte) error { 47 v, err := time.ParseDuration(string(text)) 48 if err != nil { 49 return err 50 } 51 *s = Duration{v} 52 53 return nil 54 } 55 56 // Randomly generate a duration between from and until. 57 // 58 // Returns from if its greater than until. 59 func RandomDuration(from Duration, until Duration) Duration { 60 if from.Duration >= until.Duration { 61 return from 62 } 63 64 period := until.Duration - from.Duration 65 return Duration{from.Duration + time.Duration(rand.Intn(int(period)))} 66 67 }