From 115e175c3d254b3a4797607821a0aab6f08058bb Mon Sep 17 00:00:00 2001 From: Eyal Posener Date: Thu, 11 May 2017 20:48:40 +0300 Subject: [PATCH] Change Match to be a function --- command.go | 8 ++++---- gocomplete/tests.go | 4 ++-- match/file.go | 22 ++++++---------------- match/match.go | 13 ++++--------- match/match_test.go | 26 +++++++++++++++++--------- match/prefix.go | 10 ++-------- predict.go | 16 ++++++---------- 7 files changed, 41 insertions(+), 58 deletions(-) diff --git a/command.go b/command.go index 4f2207a..6557162 100644 --- a/command.go +++ b/command.go @@ -53,8 +53,8 @@ func (c *Command) predict(a Args) (options []string, only bool) { // add global available complete Predict for flag := range c.Flags { - if m := match.Prefix(flag); m.Match(a.Last) { - options = append(options, m.String()) + if match.Prefix(flag, a.Last) { + options = append(options, flag) } } @@ -82,8 +82,8 @@ func (c *Command) searchSub(a Args) (sub string, all []string, only bool) { // subCommands returns a list of matching sub commands func (c *Command) subCommands(last string) (prediction []string) { for sub := range c.Sub { - if m := match.Prefix(sub); m.Match(last) { - prediction = append(prediction, m.String()) + if match.Prefix(sub, last) { + prediction = append(prediction, sub) } } return diff --git a/gocomplete/tests.go b/gocomplete/tests.go index 4be3f0d..d2c32e7 100644 --- a/gocomplete/tests.go +++ b/gocomplete/tests.go @@ -21,8 +21,8 @@ func predictTest(funcPrefix ...string) complete.Predictor { return complete.PredictFunc(func(a complete.Args) (prediction []string) { tests := testNames(funcPrefix) for _, t := range tests { - if m := match.Prefix(t); m.Match(a.Last) { - prediction = append(prediction, m.String()) + if match.Prefix(t, a.Last) { + prediction = append(prediction, t) } } return diff --git a/match/file.go b/match/file.go index 0b554ce..eee5bec 100644 --- a/match/file.go +++ b/match/file.go @@ -1,26 +1,16 @@ package match -import ( - "strings" -) +import "strings" -// File is a file name Matcher, if the last word can prefix the -// File path, there is a possible match -type File string - -func (a File) String() string { - return string(a) -} - -// Match returns true if prefix's abs path prefixes a's abs path -func (a File) Match(prefix string) bool { +// File returns true if prefix can match the file +func File(file, prefix string) bool { // special case for current directory completion - if a == "./" && (prefix == "." || prefix == "") { + if file == "./" && (prefix == "." || prefix == "") { return true } - cmp := strings.TrimPrefix(string(a), "./") + file = strings.TrimPrefix(file, "./") prefix = strings.TrimPrefix(prefix, "./") - return strings.HasPrefix(cmp, prefix) + return strings.HasPrefix(file, prefix) } diff --git a/match/match.go b/match/match.go index ae95549..812fcac 100644 --- a/match/match.go +++ b/match/match.go @@ -1,11 +1,6 @@ package match -import "fmt" - -// Matcher matches itself to a string -// it is used for comparing a given argument to the last typed -// word, and see if it is a possible auto complete option. -type Matcher interface { - fmt.Stringer - Match(prefix string) bool -} +// Match matches two strings +// it is used for comparing a term to the last typed +// word, the prefix, and see if it is a possible auto complete option. +type Match func(term, prefix string) bool diff --git a/match/match_test.go b/match/match_test.go index d7a851a..b5a0d87 100644 --- a/match/match_test.go +++ b/match/match_test.go @@ -1,6 +1,7 @@ package match import ( + "fmt" "os" "testing" ) @@ -21,11 +22,13 @@ func TestMatch(t *testing.T) { } tests := []struct { - m Matcher + m Match + long string tests []matcherTest }{ { - m: Prefix("abcd"), + m: Prefix, + long: "abcd", tests: []matcherTest{ {prefix: "", want: true}, {prefix: "ab", want: true}, @@ -33,14 +36,16 @@ func TestMatch(t *testing.T) { }, }, { - m: Prefix(""), + m: Prefix, + long: "", tests: []matcherTest{ {prefix: "ac", want: false}, {prefix: "", want: true}, }, }, { - m: File("file.txt"), + m: File, + long: "file.txt", tests: []matcherTest{ {prefix: "", want: true}, {prefix: "f", want: true}, @@ -59,7 +64,8 @@ func TestMatch(t *testing.T) { }, }, { - m: File("./file.txt"), + m: File, + long: "./file.txt", tests: []matcherTest{ {prefix: "", want: true}, {prefix: "f", want: true}, @@ -78,7 +84,8 @@ func TestMatch(t *testing.T) { }, }, { - m: File("/file.txt"), + m: File, + long: "/file.txt", tests: []matcherTest{ {prefix: "", want: true}, {prefix: "f", want: false}, @@ -97,7 +104,8 @@ func TestMatch(t *testing.T) { }, }, { - m: File("./"), + m: File, + long: "./", tests: []matcherTest{ {prefix: "", want: true}, {prefix: ".", want: true}, @@ -109,9 +117,9 @@ func TestMatch(t *testing.T) { for _, tt := range tests { for _, ttt := range tt.tests { - name := "matcher='" + tt.m.String() + "'&prefix='" + ttt.prefix + "'" + name := fmt.Sprintf("matcher=%T&long='%s'&prefix='%s'", tt.m, tt.long, ttt.prefix) t.Run(name, func(t *testing.T) { - got := tt.m.Match(ttt.prefix) + got := tt.m(tt.long, ttt.prefix) if got != ttt.want { t.Errorf("Failed %s: got = %t, want: %t", name, got, ttt.want) } diff --git a/match/prefix.go b/match/prefix.go index d54902d..9a01ba6 100644 --- a/match/prefix.go +++ b/match/prefix.go @@ -3,13 +3,7 @@ package match import "strings" // Prefix is a simple Matcher, if the word is it's prefix, there is a match -type Prefix string - -func (a Prefix) String() string { - return string(a) -} - // Match returns true if a has the prefix as prefix -func (a Prefix) Match(prefix string) bool { - return strings.HasPrefix(string(a), prefix) +func Prefix(long, prefix string) bool { + return strings.HasPrefix(long, prefix) } diff --git a/predict.go b/predict.go index d5287c9..9e1cce9 100644 --- a/predict.go +++ b/predict.go @@ -49,19 +49,15 @@ var PredictAnything = PredictFunc(func(Args) []string { return nil }) // PredictSet expects specific set of terms, given in the options argument. func PredictSet(options ...string) Predictor { - p := predictSet{} - for _, o := range options { - p = append(p, match.Prefix(o)) - } - return p + return predictSet(options) } -type predictSet []match.Prefix +type predictSet []string func (p predictSet) Predict(a Args) (prediction []string) { for _, m := range p { - if m.Match(a.Last) { - prediction = append(prediction, m.String()) + if match.Prefix(m, a.Last) { + prediction = append(prediction, m) } } return @@ -104,8 +100,8 @@ func files(pattern string, allowDirs, allowFiles bool) PredictFunc { } // add all matching files to prediction for _, f := range files { - if m := match.File(f); m.Match(a.Last) { - prediction = append(prediction, m.String()) + if match.File(f, a.Last) { + prediction = append(prediction, f) } } return