Skip to content

Commit 665e37d

Browse files
authored
YAML error improvement (#4201)
1 parent 10bff05 commit 665e37d

File tree

6 files changed

+44
-26
lines changed

6 files changed

+44
-26
lines changed

private/bufpkg/bufconfig/buf_gen_yaml_file.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package bufconfig
1717
import (
1818
"context"
1919
"encoding/json"
20-
"fmt"
2120
"io"
2221

2322
"buf.build/go/standard/xslices"
@@ -179,7 +178,7 @@ func readBufGenYAMLFile(
179178
case FileVersionV1Beta1:
180179
var externalGenYAMLFile externalBufGenYAMLFileV1Beta1
181180
if err := getUnmarshalStrict(allowJSON)(data, &externalGenYAMLFile); err != nil {
182-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
181+
return nil, err
183182
}
184183
generateConfig, err := newGenerateConfigFromExternalFileV1Beta1(externalGenYAMLFile)
185184
if err != nil {
@@ -194,7 +193,7 @@ func readBufGenYAMLFile(
194193
case FileVersionV1:
195194
var externalGenYAMLFile externalBufGenYAMLFileV1
196195
if err := getUnmarshalStrict(allowJSON)(data, &externalGenYAMLFile); err != nil {
197-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
196+
return nil, err
198197
}
199198
generateConfig, err := newGenerateConfigFromExternalFileV1(externalGenYAMLFile)
200199
if err != nil {
@@ -209,7 +208,7 @@ func readBufGenYAMLFile(
209208
case FileVersionV2:
210209
var externalGenYAMLFile externalBufGenYAMLFileV2
211210
if err := getUnmarshalStrict(allowJSON)(data, &externalGenYAMLFile); err != nil {
212-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
211+
return nil, err
213212
}
214213
generateConfig, err := newGenerateConfigFromExternalFileV2(externalGenYAMLFile)
215214
if err != nil {

private/bufpkg/bufconfig/buf_lock_file.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ func readBufLockFile(
353353
case FileVersionV1Beta1, FileVersionV1:
354354
var externalBufLockFile externalBufLockFileV1Beta1V1
355355
if err := getUnmarshalStrict(allowJSON)(data, &externalBufLockFile); err != nil {
356-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
356+
return nil, err
357357
}
358358
depModuleKeys := make([]bufmodule.ModuleKey, len(externalBufLockFile.Deps))
359359
for i, dep := range externalBufLockFile.Deps {
@@ -406,7 +406,7 @@ func readBufLockFile(
406406
case FileVersionV2:
407407
var externalBufLockFile externalBufLockFileV2
408408
if err := getUnmarshalStrict(allowJSON)(data, &externalBufLockFile); err != nil {
409-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
409+
return nil, err
410410
}
411411
depModuleKeys := make([]bufmodule.ModuleKey, len(externalBufLockFile.Deps))
412412
for i, dep := range externalBufLockFile.Deps {

private/bufpkg/bufconfig/buf_work_yaml_file.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func readBufWorkYAMLFile(
186186
}
187187
var externalBufWorkYAMLFile externalBufWorkYAMLFileV1
188188
if err := getUnmarshalStrict(allowJSON)(data, &externalBufWorkYAMLFile); err != nil {
189-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
189+
return nil, err
190190
}
191191
return newBufWorkYAMLFile(fileVersion, objectData, externalBufWorkYAMLFile.Directories)
192192
}

private/bufpkg/bufconfig/buf_yaml_file.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ func readBufYAMLFile(
403403
case FileVersionV1Beta1, FileVersionV1:
404404
var externalBufYAMLFile externalBufYAMLFileV1Beta1V1
405405
if err := getUnmarshalStrict(allowJSON)(data, &externalBufYAMLFile); err != nil {
406-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
406+
return nil, err
407407
}
408408
if fileVersion == FileVersionV1 && len(externalBufYAMLFile.Build.Roots) > 0 {
409409
return nil, fmt.Errorf("build.roots cannot be set on version %v: %v", fileVersion, externalBufYAMLFile.Build.Roots)
@@ -475,7 +475,7 @@ func readBufYAMLFile(
475475
case FileVersionV2:
476476
var externalBufYAMLFile externalBufYAMLFileV2
477477
if err := getUnmarshalStrict(allowJSON)(data, &externalBufYAMLFile); err != nil {
478-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
478+
return nil, err
479479
}
480480
externalModules := externalBufYAMLFile.Modules
481481
if len(externalModules) == 0 {

private/bufpkg/bufpolicy/bufpolicyconfig/buf_policy_yaml_file.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func readBufPolicyYAMLFile(
198198
}
199199
var externalBufPolicyYAMLFile externalBufPolicyYAMLFileV2
200200
if err := getUnmarshalStrict(allowJSON)(data, &externalBufPolicyYAMLFile); err != nil {
201-
return nil, fmt.Errorf("invalid as version %v: %w", fileVersion, err)
201+
return nil, err
202202
}
203203
var lintConfig bufpolicy.LintConfig
204204
if !externalBufPolicyYAMLFile.Lint.isEmpty() {

private/pkg/encoding/encoding.go

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ func UnmarshalJSONStrict(data []byte, v any) error {
3535
}
3636
jsonDecoder := json.NewDecoder(bytes.NewReader(data))
3737
jsonDecoder.DisallowUnknownFields()
38-
if err := jsonDecoder.Decode(v); err != nil {
39-
return fmt.Errorf("could not unmarshal as JSON: %v", err)
40-
}
41-
return nil
38+
return jsonDecoder.Decode(v)
4239
}
4340

4441
// UnmarshalYAMLStrict unmarshals the data as YAML, returning a user error on failure.
@@ -49,10 +46,7 @@ func UnmarshalYAMLStrict(data []byte, v any) error {
4946
return nil
5047
}
5148
yamlDecoder := NewYAMLDecoderStrict(bytes.NewReader(data))
52-
if err := yamlDecoder.Decode(v); err != nil {
53-
return fmt.Errorf("could not unmarshal as YAML: %v", err)
54-
}
55-
return nil
49+
return updateYAMLTypeError(yamlDecoder.Decode(v))
5650
}
5751

5852
// UnmarshalJSONOrYAMLStrict unmarshals the data as JSON or YAML in order, returning
@@ -79,10 +73,7 @@ func UnmarshalJSONNonStrict(data []byte, v any) error {
7973
return nil
8074
}
8175
jsonDecoder := json.NewDecoder(bytes.NewReader(data))
82-
if err := jsonDecoder.Decode(v); err != nil {
83-
return fmt.Errorf("could not unmarshal as JSON: %v", err)
84-
}
85-
return nil
76+
return jsonDecoder.Decode(v)
8677
}
8778

8879
// UnmarshalYAMLNonStrict unmarshals the data as YAML, returning a user error on failure.
@@ -93,10 +84,7 @@ func UnmarshalYAMLNonStrict(data []byte, v any) error {
9384
return nil
9485
}
9586
yamlDecoder := NewYAMLDecoderNonStrict(bytes.NewReader(data))
96-
if err := yamlDecoder.Decode(v); err != nil {
97-
return fmt.Errorf("could not unmarshal as YAML: %v", err)
98-
}
99-
return nil
87+
return updateYAMLTypeError(yamlDecoder.Decode(v))
10088
}
10189

10290
// UnmarshalJSONOrYAMLNonStrict unmarshals the data as JSON or YAML in order, returning
@@ -200,3 +188,34 @@ func InterfaceSliceOrStringToStringSlice(in any) ([]string, error) {
200188
return nil, fmt.Errorf("could not interpret %T as string or string slice", in)
201189
}
202190
}
191+
192+
// *** PRIVATE ***
193+
194+
func updateYAMLTypeError(err error) error {
195+
if err == nil {
196+
return nil
197+
}
198+
var yamlTypeError *yaml.TypeError
199+
if errors.As(err, &yamlTypeError) {
200+
for i, errString := range yamlTypeError.Errors {
201+
yamlTypeError.Errors[i] = replaceAfter(
202+
replaceAfter(
203+
errString,
204+
"already set in type",
205+
"already set",
206+
),
207+
"not found in type",
208+
"not found",
209+
)
210+
}
211+
return yamlTypeError
212+
}
213+
return err
214+
}
215+
216+
func replaceAfter(s string, substitute string, replace string) string {
217+
if index := strings.Index(s, substitute); index != -1 {
218+
return s[:index] + replace
219+
}
220+
return s
221+
}

0 commit comments

Comments
 (0)