| package flags |
| |
| func levenshtein(s string, t string) int { |
| if len(s) == 0 { |
| return len(t) |
| } |
| |
| if len(t) == 0 { |
| return len(s) |
| } |
| |
| dists := make([][]int, len(s)+1) |
| for i := range dists { |
| dists[i] = make([]int, len(t)+1) |
| dists[i][0] = i |
| } |
| |
| for j := range t { |
| dists[0][j] = j |
| } |
| |
| for i, sc := range s { |
| for j, tc := range t { |
| if sc == tc { |
| dists[i+1][j+1] = dists[i][j] |
| } else { |
| dists[i+1][j+1] = dists[i][j] + 1 |
| if dists[i+1][j] < dists[i+1][j+1] { |
| dists[i+1][j+1] = dists[i+1][j] + 1 |
| } |
| if dists[i][j+1] < dists[i+1][j+1] { |
| dists[i+1][j+1] = dists[i][j+1] + 1 |
| } |
| } |
| } |
| } |
| |
| return dists[len(s)][len(t)] |
| } |
| |
| func closestChoice(cmd string, choices []string) (string, int) { |
| if len(choices) == 0 { |
| return "", 0 |
| } |
| |
| mincmd := -1 |
| mindist := -1 |
| |
| for i, c := range choices { |
| l := levenshtein(cmd, c) |
| |
| if mincmd < 0 || l < mindist { |
| mindist = l |
| mincmd = i |
| } |
| } |
| |
| return choices[mincmd], mindist |
| } |