closest.go 787 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package flags
  2. func levenshtein(s string, t string) int {
  3. if len(s) == 0 {
  4. return len(t)
  5. }
  6. if len(t) == 0 {
  7. return len(s)
  8. }
  9. var l1, l2, l3 int
  10. if len(s) == 1 {
  11. l1 = len(t) + 1
  12. } else {
  13. l1 = levenshtein(s[1:len(s)-1], t) + 1
  14. }
  15. if len(t) == 1 {
  16. l2 = len(s) + 1
  17. } else {
  18. l2 = levenshtein(t[1:len(t)-1], s) + 1
  19. }
  20. l3 = levenshtein(s[1:len(s)], t[1:len(t)])
  21. if s[0] != t[0] {
  22. l3 += 1
  23. }
  24. if l2 < l1 {
  25. l1 = l2
  26. }
  27. if l1 < l3 {
  28. return l1
  29. }
  30. return l3
  31. }
  32. func closestChoice(cmd string, choices []string) (string, int) {
  33. if len(choices) == 0 {
  34. return "", 0
  35. }
  36. mincmd := -1
  37. mindist := -1
  38. for i, c := range choices {
  39. l := levenshtein(cmd, c)
  40. if mincmd < 0 || l < mindist {
  41. mindist = l
  42. mincmd = i
  43. }
  44. }
  45. return choices[mincmd], mindist
  46. }