summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--command.go4
-rw-r--r--gocomplete/tests.go18
-rw-r--r--predicate.go48
-rw-r--r--run_test.go11
4 files changed, 35 insertions, 46 deletions
diff --git a/command.go b/command.go
index fc0e28b..eac9dde 100644
--- a/command.go
+++ b/command.go
@@ -2,13 +2,13 @@ package complete
type Commands map[string]Command
-type Flags map[string]*Predicate
+type Flags map[string]Predicate
type Command struct {
Name string
Sub Commands
Flags Flags
- Args *Predicate
+ Args Predicate
}
// options returns all available complete options for the given command
diff --git a/gocomplete/tests.go b/gocomplete/tests.go
index 865058f..60218a5 100644
--- a/gocomplete/tests.go
+++ b/gocomplete/tests.go
@@ -11,16 +11,14 @@ import (
"github.com/posener/complete"
)
-func predictTest(testType string) *complete.Predicate {
- return &complete.Predicate{
- Predictor: func(last string) []complete.Option {
- tests := testNames(testType)
- options := make([]complete.Option, len(tests))
- for i := range tests {
- options[i] = complete.Arg(tests[i])
- }
- return options
- },
+func predictTest(testType string) complete.Predicate {
+ return func(last string) []complete.Option {
+ tests := testNames(testType)
+ options := make([]complete.Option, len(tests))
+ for i := range tests {
+ options[i] = complete.Arg(tests[i])
+ }
+ return options
}
}
diff --git a/predicate.go b/predicate.go
index a5b760e..f975e27 100644
--- a/predicate.go
+++ b/predicate.go
@@ -6,53 +6,41 @@ import (
)
// Predicate determines what terms can follow a command or a flag
-type Predicate struct {
- // Predictor is function that returns list of arguments that can
- // come after the flag/command
- Predictor func(last string) []Option
-}
+type Predicate func(last string) []Option
// Or unions two predicate struct, so that the result predicate
// returns the union of their predication
-func (p *Predicate) Or(other *Predicate) *Predicate {
+func (p Predicate) Or(other Predicate) Predicate {
if p == nil || other == nil {
return nil
}
- return &Predicate{
- Predictor: func(last string) []Option { return append(p.predict(last), other.predict(last)...) },
- }
+ return func(last string) []Option { return append(p.predict(last), other.predict(last)...) }
}
-func (p *Predicate) predict(last string) []Option {
- if p == nil || p.Predictor == nil {
+func (p Predicate) predict(last string) []Option {
+ if p == nil {
return nil
}
- return p.Predictor(last)
+ return p(last)
}
var (
- PredictNothing *Predicate = nil
- PredictAnything = &Predicate{}
- PredictDirs = &Predicate{Predictor: dirs}
+ PredictNothing Predicate = nil
)
-func PredictSet(options ...string) *Predicate {
- return &Predicate{
- Predictor: func(last string) []Option {
- ret := make([]Option, len(options))
- for i := range options {
- ret[i] = Arg(options[i])
- }
- return ret
- },
- }
-}
+func PredictAnything(last string) []Option { return nil }
-func PredictFiles(pattern string) *Predicate {
- return &Predicate{Predictor: glob(pattern)}
+func PredictSet(options ...string) Predicate {
+ return func(last string) []Option {
+ ret := make([]Option, len(options))
+ for i := range options {
+ ret[i] = Arg(options[i])
+ }
+ return ret
+ }
}
-func dirs(last string) (options []Option) {
+func PredictDirs(last string) (options []Option) {
dir := dirFromLast(last)
return dirsAt(dir)
}
@@ -71,7 +59,7 @@ func dirsAt(path string) []Option {
return filesToOptions(dirs)
}
-func glob(pattern string) func(last string) []Option {
+func PredictFiles(pattern string) Predicate {
return func(last string) []Option {
dir := dirFromLast(last)
files, err := filepath.Glob(filepath.Join(dir, pattern))
diff --git a/run_test.go b/run_test.go
index 0fe52d6..4cbf36d 100644
--- a/run_test.go
+++ b/run_test.go
@@ -9,9 +9,12 @@ import (
func TestCompleter_Complete(t *testing.T) {
t.Parallel()
+ // Set debug environment variable so logs will be printed
if testing.Verbose() {
os.Setenv(envDebug, "1")
}
+
+ // Change to tests directory for testing completion of files and directories
err := os.Chdir("./tests")
if err != nil {
t.Fatal(err)
@@ -20,20 +23,20 @@ func TestCompleter_Complete(t *testing.T) {
c := Command{
Sub: map[string]Command{
"sub1": {
- Flags: map[string]*Predicate{
+ Flags: map[string]Predicate{
"-flag1": PredictAnything,
"-flag2": PredictNothing,
},
},
"sub2": {
- Flags: map[string]*Predicate{
+ Flags: map[string]Predicate{
"-flag2": PredictNothing,
"-flag3": PredictSet("opt1", "opt2", "opt12"),
},
- Args: PredictDirs.Or(PredictFiles("*.md")),
+ Args: Predicate(PredictDirs).Or(PredictFiles("*.md")),
},
},
- Flags: map[string]*Predicate{
+ Flags: map[string]Predicate{
"-h": PredictNothing,
"-global1": PredictAnything,
"-o": PredictFiles("*.txt"),