github.com/sl1pm4t/consul@v1.4.5-0.20190325224627-74c31c540f9c/agent/config/flagset.go (about)

     1  package config
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  	"time"
     7  )
     8  
     9  // boolPtrValue is a flag.Value which stores the value in a *bool if it
    10  // can be parsed with strconv.ParseBool. If the value was not set the
    11  // pointer is nil.
    12  type boolPtrValue struct {
    13  	v **bool
    14  	b bool
    15  }
    16  
    17  func newBoolPtrValue(p **bool) *boolPtrValue {
    18  	return &boolPtrValue{p, false}
    19  }
    20  
    21  func (s *boolPtrValue) IsBoolFlag() bool { return true }
    22  
    23  func (s *boolPtrValue) Set(val string) error {
    24  	b, err := strconv.ParseBool(val)
    25  	if err != nil {
    26  		return err
    27  	}
    28  	*s.v, s.b = &b, true
    29  	return nil
    30  }
    31  
    32  func (s *boolPtrValue) Get() interface{} {
    33  	if s.b {
    34  		return *s.v
    35  	}
    36  	return (*bool)(nil)
    37  }
    38  
    39  func (s *boolPtrValue) String() string {
    40  	if s.b {
    41  		return strconv.FormatBool(**s.v)
    42  	}
    43  	return ""
    44  }
    45  
    46  // durationPtrValue is a flag.Value which stores the value in a
    47  // *time.Duration if it can be parsed with time.ParseDuration. If the
    48  // value was not set the pointer is nil.
    49  type durationPtrValue struct {
    50  	v **time.Duration
    51  	b bool
    52  }
    53  
    54  func newDurationPtrValue(p **time.Duration) *durationPtrValue {
    55  	return &durationPtrValue{p, false}
    56  }
    57  
    58  func (s *durationPtrValue) Set(val string) error {
    59  	d, err := time.ParseDuration(val)
    60  	if err != nil {
    61  		return err
    62  	}
    63  	*s.v, s.b = &d, true
    64  	return nil
    65  }
    66  
    67  func (s *durationPtrValue) Get() interface{} {
    68  	if s.b {
    69  		return *s.v
    70  	}
    71  	return (*time.Duration)(nil)
    72  }
    73  
    74  func (s *durationPtrValue) String() string {
    75  	if s.b {
    76  		return (*(*s).v).String()
    77  	}
    78  	return ""
    79  }
    80  
    81  // intPtrValue is a flag.Value which stores the value in a *int if it
    82  // can be parsed with strconv.Atoi. If the value was not set the pointer
    83  // is nil.
    84  type intPtrValue struct {
    85  	v **int
    86  	b bool
    87  }
    88  
    89  func newIntPtrValue(p **int) *intPtrValue {
    90  	return &intPtrValue{p, false}
    91  }
    92  
    93  func (s *intPtrValue) Set(val string) error {
    94  	n, err := strconv.Atoi(val)
    95  	if err != nil {
    96  		return err
    97  	}
    98  	*s.v, s.b = &n, true
    99  	return nil
   100  }
   101  
   102  func (s *intPtrValue) Get() interface{} {
   103  	if s.b {
   104  		return *s.v
   105  	}
   106  	return (*int)(nil)
   107  }
   108  
   109  func (s *intPtrValue) String() string {
   110  	if s.b {
   111  		return strconv.Itoa(**s.v)
   112  	}
   113  	return ""
   114  }
   115  
   116  // stringMapValue is a flag.Value which stores the value in a map[string]string if the
   117  // value is in "key:value" format. This can be specified multiple times.
   118  type stringMapValue map[string]string
   119  
   120  func newStringMapValue(p *map[string]string) *stringMapValue {
   121  	*p = map[string]string{}
   122  	return (*stringMapValue)(p)
   123  }
   124  
   125  func (s *stringMapValue) Set(val string) error {
   126  	p := strings.SplitN(val, ":", 2)
   127  	k, v := p[0], ""
   128  	if len(p) == 2 {
   129  		v = p[1]
   130  	}
   131  	(*s)[k] = v
   132  	return nil
   133  }
   134  
   135  func (s *stringMapValue) Get() interface{} {
   136  	return s
   137  }
   138  
   139  func (s *stringMapValue) String() string {
   140  	var x []string
   141  	for k, v := range *s {
   142  		if v == "" {
   143  			x = append(x, k)
   144  		} else {
   145  			x = append(x, k+":"+v)
   146  		}
   147  	}
   148  	return strings.Join(x, " ")
   149  }
   150  
   151  // stringPtrValue is a flag.Value which stores the value in a *string.
   152  // If the value was not set the pointer is nil.
   153  type stringPtrValue struct {
   154  	v **string
   155  	b bool
   156  }
   157  
   158  func newStringPtrValue(p **string) *stringPtrValue {
   159  	return &stringPtrValue{p, false}
   160  }
   161  
   162  func (s *stringPtrValue) Set(val string) error {
   163  	*s.v, s.b = &val, true
   164  	return nil
   165  }
   166  
   167  func (s *stringPtrValue) Get() interface{} {
   168  	if s.b {
   169  		return *s.v
   170  	}
   171  	return (*string)(nil)
   172  }
   173  
   174  func (s *stringPtrValue) String() string {
   175  	if s.b {
   176  		return **s.v
   177  	}
   178  	return ""
   179  }
   180  
   181  // stringSliceValue is a flag.Value which appends the value to a []string.
   182  // This can be specified multiple times.
   183  type stringSliceValue []string
   184  
   185  func newStringSliceValue(p *[]string) *stringSliceValue {
   186  	return (*stringSliceValue)(p)
   187  }
   188  
   189  func (s *stringSliceValue) Set(val string) error {
   190  	*s = append(*s, val)
   191  	return nil
   192  }
   193  
   194  func (s *stringSliceValue) Get() interface{} {
   195  	return s
   196  }
   197  
   198  func (s *stringSliceValue) String() string {
   199  	return strings.Join(*s, " ")
   200  }