github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/cli/opts/duration.go (about) 1 package opts 2 3 import ( 4 "time" 5 6 "github.com/pkg/errors" 7 ) 8 9 // PositiveDurationOpt is an option type for time.Duration that uses a pointer. 10 // It behave similarly to DurationOpt but only allows positive duration values. 11 type PositiveDurationOpt struct { 12 DurationOpt 13 } 14 15 // Set a new value on the option. Setting a negative duration value will cause 16 // an error to be returned. 17 func (d *PositiveDurationOpt) Set(s string) error { 18 err := d.DurationOpt.Set(s) 19 if err != nil { 20 return err 21 } 22 if *d.DurationOpt.value < 0 { 23 return errors.Errorf("duration cannot be negative") 24 } 25 return nil 26 } 27 28 // DurationOpt is an option type for time.Duration that uses a pointer. This 29 // allows us to get nil values outside, instead of defaulting to 0 30 type DurationOpt struct { 31 value *time.Duration 32 } 33 34 // NewDurationOpt creates a DurationOpt with the specified duration 35 func NewDurationOpt(value *time.Duration) *DurationOpt { 36 return &DurationOpt{ 37 value: value, 38 } 39 } 40 41 // Set a new value on the option 42 func (d *DurationOpt) Set(s string) error { 43 v, err := time.ParseDuration(s) 44 d.value = &v 45 return err 46 } 47 48 // Type returns the type of this option, which will be displayed in `--help` output 49 func (d *DurationOpt) Type() string { 50 return "duration" 51 } 52 53 // String returns a string repr of this option 54 func (d *DurationOpt) String() string { 55 if d.value != nil { 56 return d.value.String() 57 } 58 return "" 59 } 60 61 // Value returns the time.Duration 62 func (d *DurationOpt) Value() *time.Duration { 63 return d.value 64 }