| 
9 | 9 | 	"strings"  | 
10 | 10 | 	"unicode/utf8"  | 
11 | 11 | 
 
  | 
 | 12 | +	"github.com/goccy/go-yaml"  | 
12 | 13 | 	"github.com/mattn/go-runewidth"  | 
13 | 14 | 
 
  | 
14 | 15 | 	"github.com/itchyny/gojq"  | 
@@ -121,18 +122,14 @@ type yamlParseError struct {  | 
121 | 122 | }  | 
122 | 123 | 
 
  | 
123 | 124 | func (err *yamlParseError) Error() string {  | 
124 |  | -	var line int  | 
125 |  | -	msg := strings.TrimPrefix(  | 
126 |  | -		strings.TrimPrefix(err.err.Error(), "yaml: "),  | 
127 |  | -		"unmarshal errors:\n  ")  | 
128 |  | -	if _, e := fmt.Sscanf(msg, "line %d: ", &line); e != nil {  | 
129 |  | -		return "invalid yaml: " + err.fname  | 
 | 125 | +	var offset int  | 
 | 126 | +	var e *yaml.SyntaxError  | 
 | 127 | +	if errors.As(err.err, &e) {  | 
 | 128 | +		offset = e.Token.Position.Offset  | 
130 | 129 | 	}  | 
131 |  | -	_, msg, _ = strings.Cut(msg, ": ")  | 
132 |  | -	msg, _, _ = strings.Cut(msg, "\n")  | 
133 |  | -	linestr := getLineByLine(err.contents, line)  | 
 | 130 | +	linestr, line, column := getLineByOffset(err.contents, offset)  | 
134 | 131 | 	return fmt.Sprintf("invalid yaml: %s:%d\n%s  %s",  | 
135 |  | -		err.fname, line, formatLineInfo(linestr, line, 0), msg)  | 
 | 132 | +		err.fname, line, formatLineInfo(linestr, line, column), e.Message)  | 
136 | 133 | }  | 
137 | 134 | 
 
  | 
138 | 135 | func getLineByOffset(str string, offset int) (linestr string, line, column int) {  | 
@@ -166,24 +163,6 @@ func getLineByOffset(str string, offset int) (linestr string, line, column int)  | 
166 | 163 | 	return  | 
167 | 164 | }  | 
168 | 165 | 
 
  | 
169 |  | -func getLineByLine(str string, line int) (linestr string) {  | 
170 |  | -	ss := &stringScanner{str, 0}  | 
171 |  | -	for {  | 
172 |  | -		str, _, ok := ss.next()  | 
173 |  | -		if !ok {  | 
174 |  | -			break  | 
175 |  | -		}  | 
176 |  | -		if line--; line == 0 {  | 
177 |  | -			linestr = str  | 
178 |  | -			break  | 
179 |  | -		}  | 
180 |  | -	}  | 
181 |  | -	if len(linestr) > 64 {  | 
182 |  | -		linestr = trimLastInvalidRune(linestr[:64])  | 
183 |  | -	}  | 
184 |  | -	return  | 
185 |  | -}  | 
186 |  | - | 
187 | 166 | func trimLastInvalidRune(s string) string {  | 
188 | 167 | 	for i := len(s) - 1; i >= 0 && i > len(s)-utf8.UTFMax; i-- {  | 
189 | 168 | 		if b := s[i]; b < utf8.RuneSelf {  | 
 | 
0 commit comments