File: error.go

package info (click to toggle)
docker.io 26.1.5%2Bdfsg1-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 68,576 kB
  • sloc: sh: 5,748; makefile: 912; ansic: 664; asm: 228; python: 162
file content (71 lines) | stat: -rw-r--r-- 1,267 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package suggest

import (
	"strings"

	"github.com/agext/levenshtein"
)

// WrapError wraps error with a suggestion for fixing it
func WrapError(err error, val string, options []string, caseSensitive bool) error {
	if err == nil {
		return nil
	}
	orig := val
	if !caseSensitive {
		val = strings.ToLower(val)
	}
	var match string
	mindist := 3 // same as hcl
	for _, opt := range options {
		if !caseSensitive {
			opt = strings.ToLower(opt)
		}
		if val == opt {
			// exact match means error was unrelated to the value
			return err
		}
		dist := levenshtein.Distance(val, opt, nil)
		if dist < mindist {
			if !caseSensitive {
				match = matchCase(opt, orig)
			} else {
				match = opt
			}
			mindist = dist
		}
	}

	if match == "" {
		return err
	}

	return &suggestError{
		err:   err,
		match: match,
	}
}

type suggestError struct {
	err   error
	match string
}

func (e *suggestError) Error() string {
	return e.err.Error() + " (did you mean " + e.match + "?)"
}

// Unwrap returns the underlying error.
func (e *suggestError) Unwrap() error {
	return e.err
}

func matchCase(val, orig string) string {
	if orig == strings.ToLower(orig) {
		return strings.ToLower(val)
	}
	if orig == strings.ToUpper(orig) {
		return strings.ToUpper(val)
	}
	return val
}