Compare commits
3 Commits
helper
...
helper-lev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27412fd2ea | ||
|
|
be9acdd9b2 | ||
|
|
8d9dc3d48b |
@@ -2,20 +2,20 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
ansi "github.com/mattn/go-colorable"
|
||||
"github.com/mitchellh/go-homedir"
|
||||
"github.com/qlik-oss/sense-installer/pkg"
|
||||
"github.com/qlik-oss/sense-installer/pkg/api"
|
||||
"github.com/qlik-oss/sense-installer/pkg/qliksense"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/ttacon/chalk"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/mitchellh/go-homedir"
|
||||
"github.com/qlik-oss/sense-installer/pkg"
|
||||
"github.com/qlik-oss/sense-installer/pkg/api"
|
||||
"github.com/qlik-oss/sense-installer/pkg/qliksense"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
// To run this project in ddebug mode, run:
|
||||
@@ -32,12 +32,10 @@ func initAndExecute() error {
|
||||
qlikSenseHome string
|
||||
err error
|
||||
)
|
||||
|
||||
qlikSenseHome, err = setUpPaths()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// create dirs and appropriate files for setting up contexts
|
||||
api.LogDebugMessage("QliksenseHomeDir: %s", qlikSenseHome)
|
||||
|
||||
@@ -46,10 +44,13 @@ func initAndExecute() error {
|
||||
return err
|
||||
}
|
||||
qliksenseClient.SetUpQliksenseDefaultContext()
|
||||
if err := rootCmd(qliksenseClient).Execute(); err != nil {
|
||||
return err
|
||||
cmd := rootCmd(qliksenseClient)
|
||||
//levenstein checks
|
||||
if levenstein(cmd) == false {
|
||||
if err := cmd.Execute(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -207,3 +208,78 @@ func copy(src, dst string) (int64, error) {
|
||||
nBytes, err = io.Copy(destination, source)
|
||||
return nBytes, err
|
||||
}
|
||||
|
||||
func levenstein(cmd *cobra.Command) bool {
|
||||
type closeCommand struct {
|
||||
Name string
|
||||
levensteinVal int
|
||||
}
|
||||
var lev closeCommand
|
||||
lev.Name = ""
|
||||
lev.levensteinVal = 10
|
||||
if len(os.Args) > 1 {
|
||||
args := os.Args[1]
|
||||
for _, ctx := range cmd.Commands() {
|
||||
val := *ctx
|
||||
if args == val.Name() {
|
||||
//found command
|
||||
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())
|
||||
}
|
||||
}
|
||||
if lev.levensteinVal <= 4 {
|
||||
arg := []string{}
|
||||
for _, cm := range os.Args {
|
||||
arg = append(arg, cm)
|
||||
}
|
||||
arg[1] = lev.Name
|
||||
out := ansi.NewColorableStdout()
|
||||
fmt.Fprintln(out, chalk.Green.Color("Did you mean: "), chalk.Bold.TextStyle(strings.Join(arg, " ")), "?")
|
||||
return true
|
||||
}
|
||||
}
|
||||
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