Compare commits
1 Commits
export_fun
...
helper-lev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27412fd2ea |
@@ -210,7 +210,13 @@ func copy(src, dst string) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func levenstein(cmd *cobra.Command) bool {
|
func levenstein(cmd *cobra.Command) bool {
|
||||||
cmd.SuggestionsMinimumDistance = 4
|
type closeCommand struct {
|
||||||
|
Name string
|
||||||
|
levensteinVal int
|
||||||
|
}
|
||||||
|
var lev closeCommand
|
||||||
|
lev.Name = ""
|
||||||
|
lev.levensteinVal = 10
|
||||||
if len(os.Args) > 1 {
|
if len(os.Args) > 1 {
|
||||||
args := os.Args[1]
|
args := os.Args[1]
|
||||||
for _, ctx := range cmd.Commands() {
|
for _, ctx := range cmd.Commands() {
|
||||||
@@ -218,15 +224,21 @@ func levenstein(cmd *cobra.Command) bool {
|
|||||||
if args == val.Name() {
|
if args == val.Name() {
|
||||||
//found command
|
//found command
|
||||||
return false
|
return false
|
||||||
|
} else {
|
||||||
|
currVal := comparator([]rune(args), []rune(val.Name()))
|
||||||
|
if currVal < lev.levensteinVal {
|
||||||
|
lev.levensteinVal = currVal
|
||||||
|
lev.Name = val.Name()
|
||||||
|
}
|
||||||
|
fmt.Println(currVal, val.Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
suggest := cmd.SuggestionsFor(os.Args[1])
|
if lev.levensteinVal <= 4 {
|
||||||
if len(suggest) > 0 {
|
|
||||||
arg := []string{}
|
arg := []string{}
|
||||||
for _, cm := range os.Args {
|
for _, cm := range os.Args {
|
||||||
arg = append(arg, cm)
|
arg = append(arg, cm)
|
||||||
}
|
}
|
||||||
arg[1] = suggest[0]
|
arg[1] = lev.Name
|
||||||
out := ansi.NewColorableStdout()
|
out := ansi.NewColorableStdout()
|
||||||
fmt.Fprintln(out, chalk.Green.Color("Did you mean: "), chalk.Bold.TextStyle(strings.Join(arg, " ")), "?")
|
fmt.Fprintln(out, chalk.Green.Color("Did you mean: "), chalk.Bold.TextStyle(strings.Join(arg, " ")), "?")
|
||||||
return true
|
return true
|
||||||
@@ -234,3 +246,40 @@ func levenstein(cmd *cobra.Command) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func comparator(str1, str2 []rune) int {
|
||||||
|
s1len := len(str1)
|
||||||
|
s2len := len(str2)
|
||||||
|
column := make([]int, len(str1)+1)
|
||||||
|
|
||||||
|
for y := 1; y <= s1len; y++ {
|
||||||
|
column[y] = y
|
||||||
|
}
|
||||||
|
for x := 1; x <= s2len; x++ {
|
||||||
|
column[0] = x
|
||||||
|
lastkey := x - 1
|
||||||
|
for y := 1; y <= s1len; y++ {
|
||||||
|
oldkey := column[y]
|
||||||
|
var incr int
|
||||||
|
if str1[y-1] != str2[x-1] {
|
||||||
|
incr = 1
|
||||||
|
}
|
||||||
|
column[y] = minimum(column[y]+1, column[y-1]+1, lastkey+incr)
|
||||||
|
lastkey = oldkey
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return column[s1len]
|
||||||
|
}
|
||||||
|
|
||||||
|
func minimum(a, b, c int) int {
|
||||||
|
if a < b {
|
||||||
|
if a < c {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if b < c {
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user