mirror of
https://github.com/goccy/go-yaml.git
synced 2025-10-27 19:34:20 +00:00
Use (go-yaml/errors).Wrapf instead of xerrors.Errorf
This commit is contained in:
parent
a5e1d54e41
commit
17d7c6814e
4 changed files with 42 additions and 38 deletions
51
decode.go
51
decode.go
|
|
@ -10,10 +10,10 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/goccy/go-yaml/ast"
|
"github.com/goccy/go-yaml/ast"
|
||||||
|
"github.com/goccy/go-yaml/errors"
|
||||||
"github.com/goccy/go-yaml/lexer"
|
"github.com/goccy/go-yaml/lexer"
|
||||||
"github.com/goccy/go-yaml/parser"
|
"github.com/goccy/go-yaml/parser"
|
||||||
"github.com/goccy/go-yaml/token"
|
"github.com/goccy/go-yaml/token"
|
||||||
"golang.org/x/xerrors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Decoder reads and decodes YAML values from an input stream.
|
// Decoder reads and decodes YAML values from an input stream.
|
||||||
|
|
@ -132,7 +132,7 @@ func (d *Decoder) decodeValue(valueType reflect.Type, value interface{}) (reflec
|
||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
v, err := d.decodeValue(valueType.Elem(), value)
|
v, err := d.decodeValue(valueType.Elem(), value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return reflect.Zero(valueType), xerrors.Errorf("failed to decode ptr value: %w", err)
|
return reflect.Zero(valueType), errors.Wrapf(err, "failed to decode ptr value")
|
||||||
}
|
}
|
||||||
return v.Addr(), nil
|
return v.Addr(), nil
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
|
|
@ -151,11 +151,14 @@ func (d *Decoder) decodeStruct(structType reflect.Type, value interface{}) (refl
|
||||||
structValue := reflect.New(structType)
|
structValue := reflect.New(structType)
|
||||||
structFieldMap, err := structFieldMap(structType)
|
structFieldMap, err := structFieldMap(structType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return reflect.Zero(structType), xerrors.Errorf("failed to create struct field map: %w", err)
|
return reflect.Zero(structType), errors.Wrapf(err, "failed to create struct field map")
|
||||||
|
}
|
||||||
|
if value == nil {
|
||||||
|
return reflect.Zero(structType), nil
|
||||||
}
|
}
|
||||||
valueMap, ok := value.(map[string]interface{})
|
valueMap, ok := value.(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return reflect.Zero(structType), xerrors.Errorf("value is not struct type: %s", reflect.TypeOf(value).Name())
|
return reflect.Zero(structType), errors.Wrapf(err, "value is not struct type: %s", reflect.TypeOf(value).Name())
|
||||||
}
|
}
|
||||||
for i := 0; i < structType.NumField(); i++ {
|
for i := 0; i < structType.NumField(); i++ {
|
||||||
field := structType.Field(i)
|
field := structType.Field(i)
|
||||||
|
|
@ -171,7 +174,7 @@ func (d *Decoder) decodeStruct(structType reflect.Type, value interface{}) (refl
|
||||||
valueType := fieldValue.Type()
|
valueType := fieldValue.Type()
|
||||||
vv, err := d.decodeValue(valueType, v)
|
vv, err := d.decodeValue(valueType, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return reflect.Zero(structType), xerrors.Errorf("failed to decode value: %w", err)
|
return reflect.Zero(structType), errors.Wrapf(err, "failed to decode value")
|
||||||
}
|
}
|
||||||
fieldValue.Set(vv)
|
fieldValue.Set(vv)
|
||||||
}
|
}
|
||||||
|
|
@ -185,7 +188,7 @@ func (d *Decoder) decodeSlice(sliceType reflect.Type, value interface{}) (reflec
|
||||||
for _, v := range slice {
|
for _, v := range slice {
|
||||||
vv, err := d.decodeValue(sliceValueType, v)
|
vv, err := d.decodeValue(sliceValueType, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return reflect.Zero(sliceType), xerrors.Errorf("failed to decode value: %w", err)
|
return reflect.Zero(sliceType), errors.Wrapf(err, "failed to decode value")
|
||||||
}
|
}
|
||||||
sliceValue = reflect.Append(sliceValue, vv)
|
sliceValue = reflect.Append(sliceValue, vv)
|
||||||
}
|
}
|
||||||
|
|
@ -200,7 +203,7 @@ func (d *Decoder) decodeMap(mapType reflect.Type, value interface{}) (reflect.Va
|
||||||
castedKey := reflect.ValueOf(k).Convert(keyType)
|
castedKey := reflect.ValueOf(k).Convert(keyType)
|
||||||
vv, err := d.decodeValue(valueType, v)
|
vv, err := d.decodeValue(valueType, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return reflect.Zero(mapType), xerrors.Errorf("failed to decode value: %w", err)
|
return reflect.Zero(mapType), errors.Wrapf(err, "failed to decode value")
|
||||||
}
|
}
|
||||||
mapValue.SetMapIndex(castedKey, vv)
|
mapValue.SetMapIndex(castedKey, vv)
|
||||||
}
|
}
|
||||||
|
|
@ -210,7 +213,7 @@ func (d *Decoder) decodeMap(mapType reflect.Type, value interface{}) (reflect.Va
|
||||||
func (d *Decoder) fileToReader(file string) (io.Reader, error) {
|
func (d *Decoder) fileToReader(file string) (io.Reader, error) {
|
||||||
reader, err := os.Open(file)
|
reader, err := os.Open(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to open file: %w", err)
|
return nil, errors.Wrapf(err, "failed to open file")
|
||||||
}
|
}
|
||||||
return reader, nil
|
return reader, nil
|
||||||
}
|
}
|
||||||
|
|
@ -230,7 +233,7 @@ func (d *Decoder) readersUnderDir(dir string) ([]io.Reader, error) {
|
||||||
pattern := fmt.Sprintf("%s/*", dir)
|
pattern := fmt.Sprintf("%s/*", dir)
|
||||||
matches, err := filepath.Glob(pattern)
|
matches, err := filepath.Glob(pattern)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to get files by %s: %w", pattern, err)
|
return nil, errors.Wrapf(err, "failed to get files by %s", pattern)
|
||||||
}
|
}
|
||||||
readers := []io.Reader{}
|
readers := []io.Reader{}
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
|
|
@ -239,7 +242,7 @@ func (d *Decoder) readersUnderDir(dir string) ([]io.Reader, error) {
|
||||||
}
|
}
|
||||||
reader, err := d.fileToReader(match)
|
reader, err := d.fileToReader(match)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to get reader: %w", err)
|
return nil, errors.Wrapf(err, "failed to get reader")
|
||||||
}
|
}
|
||||||
readers = append(readers, reader)
|
readers = append(readers, reader)
|
||||||
}
|
}
|
||||||
|
|
@ -254,12 +257,12 @@ func (d *Decoder) readersUnderDirRecursive(dir string) ([]io.Reader, error) {
|
||||||
}
|
}
|
||||||
reader, err := d.fileToReader(path)
|
reader, err := d.fileToReader(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to get reader: %w", err)
|
return errors.Wrapf(err, "failed to get reader")
|
||||||
}
|
}
|
||||||
readers = append(readers, reader)
|
readers = append(readers, reader)
|
||||||
return nil
|
return nil
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, xerrors.Errorf("interrupt walk in %s: %w", dir, err)
|
return nil, errors.Wrapf(err, "interrupt walk in %s", dir)
|
||||||
}
|
}
|
||||||
return readers, nil
|
return readers, nil
|
||||||
}
|
}
|
||||||
|
|
@ -267,13 +270,13 @@ func (d *Decoder) readersUnderDirRecursive(dir string) ([]io.Reader, error) {
|
||||||
func (d *Decoder) resolveReference() error {
|
func (d *Decoder) resolveReference() error {
|
||||||
for _, opt := range d.opts {
|
for _, opt := range d.opts {
|
||||||
if err := opt(d); err != nil {
|
if err := opt(d); err != nil {
|
||||||
return xerrors.Errorf("failed to exec option: %w", err)
|
return errors.Wrapf(err, "failed to exec option")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, file := range d.referenceFiles {
|
for _, file := range d.referenceFiles {
|
||||||
reader, err := d.fileToReader(file)
|
reader, err := d.fileToReader(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to get reader: %w", err)
|
return errors.Wrapf(err, "failed to get reader")
|
||||||
}
|
}
|
||||||
d.referenceReaders = append(d.referenceReaders, reader)
|
d.referenceReaders = append(d.referenceReaders, reader)
|
||||||
}
|
}
|
||||||
|
|
@ -281,13 +284,13 @@ func (d *Decoder) resolveReference() error {
|
||||||
if !d.isRecursiveDir {
|
if !d.isRecursiveDir {
|
||||||
readers, err := d.readersUnderDir(dir)
|
readers, err := d.readersUnderDir(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to get readers from under the %s: %w", dir, err)
|
return errors.Wrapf(err, "failed to get readers from under the %s", dir)
|
||||||
}
|
}
|
||||||
d.referenceReaders = append(d.referenceReaders, readers...)
|
d.referenceReaders = append(d.referenceReaders, readers...)
|
||||||
} else {
|
} else {
|
||||||
readers, err := d.readersUnderDirRecursive(dir)
|
readers, err := d.readersUnderDirRecursive(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to get readers from under the %s: %w", dir, err)
|
return errors.Wrapf(err, "failed to get readers from under the %s", dir)
|
||||||
}
|
}
|
||||||
d.referenceReaders = append(d.referenceReaders, readers...)
|
d.referenceReaders = append(d.referenceReaders, readers...)
|
||||||
}
|
}
|
||||||
|
|
@ -295,12 +298,12 @@ func (d *Decoder) resolveReference() error {
|
||||||
for _, reader := range d.referenceReaders {
|
for _, reader := range d.referenceReaders {
|
||||||
bytes, err := ioutil.ReadAll(reader)
|
bytes, err := ioutil.ReadAll(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to read buffer: %w", err)
|
return errors.Wrapf(err, "failed to read buffer")
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign new anchor definition to anchorMap
|
// assign new anchor definition to anchorMap
|
||||||
if _, err := d.decode(bytes); err != nil {
|
if _, err := d.decode(bytes); err != nil {
|
||||||
return xerrors.Errorf("failed to decode: %w", err)
|
return errors.Wrapf(err, "failed to decode")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d.isResolvedReference = true
|
d.isResolvedReference = true
|
||||||
|
|
@ -314,7 +317,7 @@ func (d *Decoder) decode(bytes []byte) (interface{}, error) {
|
||||||
tokens := lexer.Tokenize(string(bytes))
|
tokens := lexer.Tokenize(string(bytes))
|
||||||
doc, err := parser.Parse(tokens)
|
doc, err := parser.Parse(tokens)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to parse yaml: %w", err)
|
return nil, errors.Wrapf(err, "failed to parse yaml")
|
||||||
}
|
}
|
||||||
return d.docToValue(doc), nil
|
return d.docToValue(doc), nil
|
||||||
}
|
}
|
||||||
|
|
@ -327,27 +330,27 @@ func (d *Decoder) decode(bytes []byte) (interface{}, error) {
|
||||||
func (d *Decoder) Decode(v interface{}) error {
|
func (d *Decoder) Decode(v interface{}) error {
|
||||||
if !d.isResolvedReference {
|
if !d.isResolvedReference {
|
||||||
if err := d.resolveReference(); err != nil {
|
if err := d.resolveReference(); err != nil {
|
||||||
return xerrors.Errorf("failed to resolve reference: %w", err)
|
return errors.Wrapf(err, "failed to resolve reference")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rv := reflect.ValueOf(v)
|
rv := reflect.ValueOf(v)
|
||||||
if rv.Type().Kind() != reflect.Ptr {
|
if rv.Type().Kind() != reflect.Ptr {
|
||||||
return xerrors.New("required pointer type value")
|
return errors.ErrDecodeRequiredPointerType
|
||||||
}
|
}
|
||||||
bytes, err := ioutil.ReadAll(d.reader)
|
bytes, err := ioutil.ReadAll(d.reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to read buffer: %w", err)
|
return errors.Wrapf(err, "failed to read buffer")
|
||||||
}
|
}
|
||||||
value, err := d.decode(bytes)
|
value, err := d.decode(bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to decode: %w", err)
|
return errors.Wrapf(err, "failed to decode")
|
||||||
}
|
}
|
||||||
if value == nil {
|
if value == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
decodedValue, err := d.decodeValue(rv.Elem().Type(), value)
|
decodedValue, err := d.decodeValue(rv.Elem().Type(), value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to decode value: %w", err)
|
return errors.Wrapf(err, "failed to decode value")
|
||||||
}
|
}
|
||||||
if decodedValue.IsValid() {
|
if decodedValue.IsValid() {
|
||||||
rv.Elem().Set(decodedValue)
|
rv.Elem().Set(decodedValue)
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/goccy/go-yaml/ast"
|
"github.com/goccy/go-yaml/ast"
|
||||||
|
"github.com/goccy/go-yaml/errors"
|
||||||
"github.com/goccy/go-yaml/printer"
|
"github.com/goccy/go-yaml/printer"
|
||||||
"github.com/goccy/go-yaml/token"
|
"github.com/goccy/go-yaml/token"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
@ -63,7 +64,7 @@ func (e *Encoder) Close() error {
|
||||||
func (e *Encoder) Encode(v interface{}) error {
|
func (e *Encoder) Encode(v interface{}) error {
|
||||||
node, err := e.encodeValue(reflect.ValueOf(v), 1)
|
node, err := e.encodeValue(reflect.ValueOf(v), 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("failed to encode value: %w", err)
|
return errors.Wrapf(err, "failed to encode value")
|
||||||
}
|
}
|
||||||
var p printer.Printer
|
var p printer.Printer
|
||||||
e.writer.Write(p.PrintNode(node))
|
e.writer.Write(p.PrintNode(node))
|
||||||
|
|
@ -266,7 +267,7 @@ func (e *Encoder) encodeStruct(value reflect.Value, column int) (ast.Node, error
|
||||||
structType := value.Type()
|
structType := value.Type()
|
||||||
structFieldMap, err := structFieldMap(structType)
|
structFieldMap, err := structFieldMap(structType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to get struct field map: %w", err)
|
return nil, errors.Wrapf(err, "failed to get struct field map")
|
||||||
}
|
}
|
||||||
for i := 0; i < value.NumField(); i++ {
|
for i := 0; i < value.NumField(); i++ {
|
||||||
field := structType.Field(i)
|
field := structType.Field(i)
|
||||||
|
|
@ -281,7 +282,7 @@ func (e *Encoder) encodeStruct(value reflect.Value, column int) (ast.Node, error
|
||||||
}
|
}
|
||||||
value, err := e.encodeValue(fieldValue, column)
|
value, err := e.encodeValue(fieldValue, column)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to encode value: %w", err)
|
return nil, errors.Wrapf(err, "failed to encode value")
|
||||||
}
|
}
|
||||||
if c, ok := value.(*ast.MappingCollectionNode); ok {
|
if c, ok := value.(*ast.MappingCollectionNode); ok {
|
||||||
for _, value := range c.Values {
|
for _, value := range c.Values {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@ var (
|
||||||
ColoredErr = true
|
ColoredErr = true
|
||||||
// WithSourceCode error with source code
|
// WithSourceCode error with source code
|
||||||
WithSourceCode = true
|
WithSourceCode = true
|
||||||
|
// ErrDecodeRequiredPointerType error instance for decoding
|
||||||
|
ErrDecodeRequiredPointerType = xerrors.New("required pointer type value")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Wrapf wrap error for stack trace
|
// Wrapf wrap error for stack trace
|
||||||
|
|
@ -80,14 +82,12 @@ func (e *wrapError) FormatError(p xerrors.Printer) error {
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if ColoredErr {
|
|
||||||
var yp printer.Printer
|
|
||||||
p.Print(yp.PrintErrorMessage("syntax error: ", ColoredErr))
|
|
||||||
} else {
|
|
||||||
p.Print("syntax error: ")
|
|
||||||
}
|
|
||||||
e.chainStateAndVerb(err)
|
e.chainStateAndVerb(err)
|
||||||
err.(xerrors.Formatter).FormatError(p)
|
if fmtErr, ok := err.(xerrors.Formatter); ok {
|
||||||
|
fmtErr.FormatError(p)
|
||||||
|
} else {
|
||||||
|
p.Print(err)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,7 +149,7 @@ func (e *syntaxError) FormatError(p xerrors.Printer) error {
|
||||||
func (e *syntaxError) Error() string {
|
func (e *syntaxError) Error() string {
|
||||||
var p printer.Printer
|
var p printer.Printer
|
||||||
pos := fmt.Sprintf("[%d:%d] ", e.token.Position.Line, e.token.Position.Column)
|
pos := fmt.Sprintf("[%d:%d] ", e.token.Position.Line, e.token.Position.Column)
|
||||||
msg := p.PrintErrorMessage(fmt.Sprintf("%s%s", pos, e.msg), ColoredErr)
|
msg := p.PrintErrorMessage(fmt.Sprintf("syntax error: %s%s", pos, e.msg), ColoredErr)
|
||||||
if WithSourceCode {
|
if WithSourceCode {
|
||||||
err := p.PrintErrorToken(e.token, ColoredErr)
|
err := p.PrintErrorToken(e.token, ColoredErr)
|
||||||
return fmt.Sprintf("%s\n%s", msg, err)
|
return fmt.Sprintf("%s\n%s", msg, err)
|
||||||
|
|
|
||||||
6
yaml.go
6
yaml.go
|
|
@ -3,7 +3,7 @@ package yaml
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
"golang.org/x/xerrors"
|
"github.com/goccy/go-yaml/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Marshaler interface may be implemented by types to customize their
|
// Marshaler interface may be implemented by types to customize their
|
||||||
|
|
@ -76,7 +76,7 @@ func Marshal(v interface{}) ([]byte, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
enc := NewEncoder(&buf)
|
enc := NewEncoder(&buf)
|
||||||
if err := enc.Encode(v); err != nil {
|
if err := enc.Encode(v); err != nil {
|
||||||
return nil, xerrors.Errorf("failed to marshal: %w", err)
|
return nil, errors.Wrapf(err, "failed to marshal", err)
|
||||||
}
|
}
|
||||||
return buf.Bytes(), nil
|
return buf.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
|
@ -107,7 +107,7 @@ func Marshal(v interface{}) ([]byte, error) {
|
||||||
func Unmarshal(data []byte, v interface{}) error {
|
func Unmarshal(data []byte, v interface{}) error {
|
||||||
dec := NewDecoder(bytes.NewBuffer(data))
|
dec := NewDecoder(bytes.NewBuffer(data))
|
||||||
if err := dec.Decode(v); err != nil {
|
if err := dec.Decode(v); err != nil {
|
||||||
return xerrors.Errorf("failed to unmarshal: %w", err)
|
return errors.Wrapf(err, "failed to unmarshal")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue