installConfigFlags creates command line flags for configuration fields and returns a function which can be called after flags have been parsed to copy any flags specified on the command line to *cfg.
(flag plugin.FlagSet, cfg *config)
| 201 | // been parsed to copy any flags specified on the command line to |
| 202 | // *cfg. |
| 203 | func installConfigFlags(flag plugin.FlagSet, cfg *config) func() error { |
| 204 | // List of functions for setting the different parts of a config. |
| 205 | var setters []func() |
| 206 | var err error // Holds any errors encountered while running setters. |
| 207 | |
| 208 | for _, field := range configFields { |
| 209 | n := field.name |
| 210 | help := configHelp[n] |
| 211 | var setter func() |
| 212 | switch ptr := cfg.fieldPtr(field).(type) { |
| 213 | case *bool: |
| 214 | f := flag.Bool(n, *ptr, help) |
| 215 | setter = func() { *ptr = *f } |
| 216 | case *int: |
| 217 | f := flag.Int(n, *ptr, help) |
| 218 | setter = func() { *ptr = *f } |
| 219 | case *float64: |
| 220 | f := flag.Float64(n, *ptr, help) |
| 221 | setter = func() { *ptr = *f } |
| 222 | case *string: |
| 223 | if len(field.choices) == 0 { |
| 224 | f := flag.String(n, *ptr, help) |
| 225 | setter = func() { *ptr = *f } |
| 226 | } else { |
| 227 | // Make a separate flag per possible choice. |
| 228 | // Set all flags to initially false so we can |
| 229 | // identify conflicts. |
| 230 | bools := make(map[string]*bool) |
| 231 | for _, choice := range field.choices { |
| 232 | bools[choice] = flag.Bool(choice, false, configHelp[choice]) |
| 233 | } |
| 234 | setter = func() { |
| 235 | var set []string |
| 236 | for k, v := range bools { |
| 237 | if *v { |
| 238 | set = append(set, k) |
| 239 | } |
| 240 | } |
| 241 | switch len(set) { |
| 242 | case 0: |
| 243 | // Leave as default value. |
| 244 | case 1: |
| 245 | *ptr = set[0] |
| 246 | default: |
| 247 | err = fmt.Errorf("conflicting options set: %v", set) |
| 248 | } |
| 249 | } |
| 250 | } |
| 251 | } |
| 252 | setters = append(setters, setter) |
| 253 | } |
| 254 | |
| 255 | return func() error { |
| 256 | // Apply the setter for every flag. |
| 257 | for _, setter := range setters { |
| 258 | setter() |
| 259 | if err != nil { |
| 260 | return err |