vendor/github.com/spf13/pflag/duration_slice.go
changeset 242 2a9ec03fe5a1
child 251 1c52a0eeb952
equal deleted inserted replaced
241:e77dad242f4c 242:2a9ec03fe5a1
       
     1 package pflag
       
     2 
       
     3 import (
       
     4 	"fmt"
       
     5 	"strings"
       
     6 	"time"
       
     7 )
       
     8 
       
     9 // -- durationSlice Value
       
    10 type durationSliceValue struct {
       
    11 	value   *[]time.Duration
       
    12 	changed bool
       
    13 }
       
    14 
       
    15 func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *durationSliceValue {
       
    16 	dsv := new(durationSliceValue)
       
    17 	dsv.value = p
       
    18 	*dsv.value = val
       
    19 	return dsv
       
    20 }
       
    21 
       
    22 func (s *durationSliceValue) Set(val string) error {
       
    23 	ss := strings.Split(val, ",")
       
    24 	out := make([]time.Duration, len(ss))
       
    25 	for i, d := range ss {
       
    26 		var err error
       
    27 		out[i], err = time.ParseDuration(d)
       
    28 		if err != nil {
       
    29 			return err
       
    30 		}
       
    31 
       
    32 	}
       
    33 	if !s.changed {
       
    34 		*s.value = out
       
    35 	} else {
       
    36 		*s.value = append(*s.value, out...)
       
    37 	}
       
    38 	s.changed = true
       
    39 	return nil
       
    40 }
       
    41 
       
    42 func (s *durationSliceValue) Type() string {
       
    43 	return "durationSlice"
       
    44 }
       
    45 
       
    46 func (s *durationSliceValue) String() string {
       
    47 	out := make([]string, len(*s.value))
       
    48 	for i, d := range *s.value {
       
    49 		out[i] = fmt.Sprintf("%s", d)
       
    50 	}
       
    51 	return "[" + strings.Join(out, ",") + "]"
       
    52 }
       
    53 
       
    54 func durationSliceConv(val string) (interface{}, error) {
       
    55 	val = strings.Trim(val, "[]")
       
    56 	// Empty string would cause a slice with one (empty) entry
       
    57 	if len(val) == 0 {
       
    58 		return []time.Duration{}, nil
       
    59 	}
       
    60 	ss := strings.Split(val, ",")
       
    61 	out := make([]time.Duration, len(ss))
       
    62 	for i, d := range ss {
       
    63 		var err error
       
    64 		out[i], err = time.ParseDuration(d)
       
    65 		if err != nil {
       
    66 			return nil, err
       
    67 		}
       
    68 
       
    69 	}
       
    70 	return out, nil
       
    71 }
       
    72 
       
    73 // GetDurationSlice returns the []time.Duration value of a flag with the given name
       
    74 func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) {
       
    75 	val, err := f.getFlagType(name, "durationSlice", durationSliceConv)
       
    76 	if err != nil {
       
    77 		return []time.Duration{}, err
       
    78 	}
       
    79 	return val.([]time.Duration), nil
       
    80 }
       
    81 
       
    82 // DurationSliceVar defines a durationSlice flag with specified name, default value, and usage string.
       
    83 // The argument p points to a []time.Duration variable in which to store the value of the flag.
       
    84 func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
       
    85 	f.VarP(newDurationSliceValue(value, p), name, "", usage)
       
    86 }
       
    87 
       
    88 // DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
       
    89 func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
       
    90 	f.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
       
    91 }
       
    92 
       
    93 // DurationSliceVar defines a duration[] flag with specified name, default value, and usage string.
       
    94 // The argument p points to a duration[] variable in which to store the value of the flag.
       
    95 func DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
       
    96 	CommandLine.VarP(newDurationSliceValue(value, p), name, "", usage)
       
    97 }
       
    98 
       
    99 // DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
       
   100 func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
       
   101 	CommandLine.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
       
   102 }
       
   103 
       
   104 // DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
       
   105 // The return value is the address of a []time.Duration variable that stores the value of the flag.
       
   106 func (f *FlagSet) DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
       
   107 	p := []time.Duration{}
       
   108 	f.DurationSliceVarP(&p, name, "", value, usage)
       
   109 	return &p
       
   110 }
       
   111 
       
   112 // DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
       
   113 func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
       
   114 	p := []time.Duration{}
       
   115 	f.DurationSliceVarP(&p, name, shorthand, value, usage)
       
   116 	return &p
       
   117 }
       
   118 
       
   119 // DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
       
   120 // The return value is the address of a []time.Duration variable that stores the value of the flag.
       
   121 func DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
       
   122 	return CommandLine.DurationSliceP(name, "", value, usage)
       
   123 }
       
   124 
       
   125 // DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
       
   126 func DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
       
   127 	return CommandLine.DurationSliceP(name, shorthand, value, usage)
       
   128 }