Compare commits

...

3 Commits

Author SHA1 Message Date
Sanat Nayar
27412fd2ea levenstein distance implimentation 2020-02-28 11:36:06 -05:00
Sanat Nayar
be9acdd9b2 levenstein's theorem implimentation 2020-02-27 15:29:57 -05:00
Sanat Nayar
8d9dc3d48b levenstein's theorem implimentation 2020-02-27 14:21:36 -05:00

View File

@@ -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
}