summaryrefslogtreecommitdiff
path: root/vendor/github.com/pborman/getopt/var.go
diff options
context:
space:
mode:
authorDan Duvall <dduvall@wikimedia.org>2018-03-06 20:31:58 -0800
committerDan Duvall <dduvall@wikimedia.org>2018-03-19 15:55:16 -0700
commiteb9b69dd3d710cb7afa1dfb6e23a5987842b21cc (patch)
tree049b11cc885e4e9f54aac8981c91a1bf3620e7af /vendor/github.com/pborman/getopt/var.go
parent6896e655eb5cc88b90e66979bc2d862eb92cbb9f (diff)
downloadblubber-eb9b69dd3d710cb7afa1dfb6e23a5987842b21cc.tar.gz
Allow for configuration policies
Summary: Implements a rough interface for validating configuration against arbitrary policy rules. Policies are provided as YAML and passed via the command line as file paths or remote URIs. The format of policies is: enforcements: - path: <path> rule: <rule> Where `<path>` is a YAML-ish path to a config field and `<rule>` is any expression our config validator understands (expressions built in by the validator library and custom tags defined in `config.validation.go`). Example policy: enforcements: - path: variants.production.base rule: oneof=debian:jessie debian:stretch - path: variants.production.runs.as rule: ne=foo - path: variants.production.node.dependencies rule: isfalse Command flag parsing was implemented in `main.go` to support the new `--policy=uri` flag and improve existing handling of `--version` and the usage statement. Test Plan: Run `go test ./...`. Reviewers: thcipriani, demon, hashar, mmodell, #release-engineering-team Reviewed By: thcipriani, #release-engineering-team Tags: #release-engineering-team Differential Revision: https://phabricator.wikimedia.org/D999
Diffstat (limited to 'vendor/github.com/pborman/getopt/var.go')
-rw-r--r--vendor/github.com/pborman/getopt/var.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/github.com/pborman/getopt/var.go b/vendor/github.com/pborman/getopt/var.go
new file mode 100644
index 0000000..fd816b9
--- /dev/null
+++ b/vendor/github.com/pborman/getopt/var.go
@@ -0,0 +1,63 @@
+// Copyright 2013 Google Inc. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package getopt
+
+import (
+ "fmt"
+ "runtime"
+)
+
+// Value is the interface to the dynamic value stored in a flag. (The default
+// value is represented as a string.) Set is passed the string to set the
+// value to as well as the Option that is being processed.
+type Value interface {
+ Set(string, Option) error
+ String() string
+}
+
+// Var creates an option of the specified name. The type and value of the option
+// are represented by the first argument, of type Value, which typically holds a
+// user-defined implementation of Value. All options are ultimately created
+// as a Var.
+func Var(p Value, name rune, helpvalue ...string) Option {
+ return CommandLine.VarLong(p, "", name, helpvalue...)
+}
+
+func VarLong(p Value, name string, short rune, helpvalue ...string) Option {
+ return CommandLine.VarLong(p, name, short, helpvalue...)
+}
+
+func (s *Set) Var(p Value, name rune, helpvalue ...string) Option {
+ return s.VarLong(p, "", name, helpvalue...)
+}
+
+func (s *Set) VarLong(p Value, name string, short rune, helpvalue ...string) Option {
+ opt := &option{
+ short: short,
+ long: name,
+ value: p,
+ defval: p.String(),
+ }
+
+ switch len(helpvalue) {
+ case 2:
+ opt.name = helpvalue[1]
+ fallthrough
+ case 1:
+ opt.help = helpvalue[0]
+ case 0:
+ default:
+ panic("Too many strings for String helpvalue")
+ }
+ if _, file, line, ok := runtime.Caller(1); ok {
+ opt.where = fmt.Sprintf("%s:%d", file, line)
+ }
+ if opt.short == 0 && opt.long == "" {
+ fmt.Fprintf(stderr, opt.where+": no short or long option given")
+ exit(1)
+ }
+ s.AddOption(opt)
+ return opt
+}