summaryrefslogtreecommitdiff
path: root/predict
diff options
context:
space:
mode:
authorEyal Posener <[email protected]>2019-11-22 11:40:09 +0200
committerEyal Posener <[email protected]>2019-11-22 11:43:37 +0200
commite8bbd08d57dcfee050a1b098e793cea633b5d35c (patch)
tree76704b78ed8046c51d1775ee87c6e04497489f7a /predict
parentcf002b9a50d777b10beaf228f316c5da34f8178a (diff)
Extract flag options to predict package
Diffstat (limited to 'predict')
-rw-r--r--predict/options.go65
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, ","))
+}