diff options
| author | Eyal Posener <[email protected]> | 2019-11-22 11:40:09 +0200 |
|---|---|---|
| committer | Eyal Posener <[email protected]> | 2019-11-22 11:43:37 +0200 |
| commit | e8bbd08d57dcfee050a1b098e793cea633b5d35c (patch) | |
| tree | 76704b78ed8046c51d1775ee87c6e04497489f7a /predict | |
| parent | cf002b9a50d777b10beaf228f316c5da34f8178a (diff) | |
Extract flag options to predict package
Diffstat (limited to 'predict')
| -rw-r--r-- | predict/options.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/predict/options.go b/predict/options.go new file mode 100644 index 0000000..df39437 --- /dev/null +++ b/predict/options.go @@ -0,0 +1,65 @@ +package predict + +import ( + "fmt" + "github.com/posener/complete/v2" + "strings" +) + +// Option provides prediction through options pattern. +// +// Usage: +// +// func(o ...predict.Option) { +// cfg := predict.Options(o) +// // use cfg.Predict... +// } +type Option func(*Config) + +// OptValues allows to set a desired set of valid values for the flag. +func OptValues(values ...string) Option { + return OptPredictor(Set(values)) +} + +// OptPredictor allows to set a custom predictor. +func OptPredictor(p complete.Predictor) Option { + return func(o *Config) { o.Predictor = p } +} + +// OptCheck enforces the valid values on the predicted flag. +func OptCheck() Option { + return func(o *Config) { o.check = true } +} + +type Config struct { + complete.Predictor + check bool +} + +func Options(os ...Option) Config { + var op Config + for _, f := range os { + f(&op) + } + return op +} + +func (c Config) Predict(prefix string) []string { + if c.Predictor != nil { + return c.Predictor.Predict(prefix) + } + return nil +} + +func (c Config) Check(value string) error { + predictions := c.Predictor.Predict(value) + if !c.check || len(predictions) == 0 { + return nil + } + for _, vv := range predictions { + if value == vv { + return nil + } + } + return fmt.Errorf("not in allowed values: %s", strings.Join(predictions, ",")) +} |
