github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/yaml/decode.go (about)

     1  package yaml
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding"
     7  	"encoding/base64"
     8  	"fmt"
     9  	"io"
    10  	"io/ioutil"
    11  	"math"
    12  	"os"
    13  	"path/filepath"
    14  	"reflect"
    15  	"strconv"
    16  	"strings"
    17  	"time"
    18  
    19  	"github.com/bingoohuang/gg/pkg/yaml/ast"
    20  	"github.com/bingoohuang/gg/pkg/yaml/internal/errors"
    21  	"github.com/bingoohuang/gg/pkg/yaml/parser"
    22  	"github.com/bingoohuang/gg/pkg/yaml/token"
    23  	"golang.org/x/xerrors"
    24  )
    25  
    26  // Decoder reads and decodes YAML values from an input stream.
    27  type Decoder struct {
    28  	reader               io.Reader
    29  	referenceReaders     []io.Reader
    30  	anchorNodeMap        map[string]ast.Node
    31  	anchorValueMap       map[string]reflect.Value
    32  	labelDecoderMap      map[string]DecoderFn
    33  	typeDecoderMap       map[reflect.Type]DecoderFn
    34  	opts                 []DecodeOption
    35  	referenceFiles       []string
    36  	referenceDirs        []string
    37  	isRecursiveDir       bool
    38  	isResolvedReference  bool
    39  	validator            StructValidator
    40  	disallowUnknownField bool
    41  	disallowDuplicateKey bool
    42  	useOrderedMap        bool
    43  	useJSONUnmarshaler   bool
    44  	parsedFile           *ast.File
    45  	streamIndex          int
    46  }
    47  
    48  // NewDecoder returns a new decoder that reads from r.
    49  func NewDecoder(r io.Reader, opts ...DecodeOption) *Decoder {
    50  	return &Decoder{
    51  		reader:               r,
    52  		anchorNodeMap:        map[string]ast.Node{},
    53  		anchorValueMap:       map[string]reflect.Value{},
    54  		labelDecoderMap:      map[string]DecoderFn{},
    55  		typeDecoderMap:       map[reflect.Type]DecoderFn{},
    56  		opts:                 opts,
    57  		referenceReaders:     []io.Reader{},
    58  		referenceFiles:       []string{},
    59  		referenceDirs:        []string{},
    60  		isRecursiveDir:       false,
    61  		isResolvedReference:  false,
    62  		disallowUnknownField: false,
    63  		disallowDuplicateKey: false,
    64  		useOrderedMap:        false,
    65  	}
    66  }
    67  
    68  func (d *Decoder) castToFloat(v interface{}) interface{} {
    69  	switch vv := v.(type) {
    70  	case int:
    71  		return float64(vv)
    72  	case int8:
    73  		return float64(vv)
    74  	case int16:
    75  		return float64(vv)
    76  	case int32:
    77  		return float64(vv)
    78  	case int64:
    79  		return float64(vv)
    80  	case uint:
    81  		return float64(vv)
    82  	case uint8:
    83  		return float64(vv)
    84  	case uint16:
    85  		return float64(vv)
    86  	case uint32:
    87  		return float64(vv)
    88  	case uint64:
    89  		return float64(vv)
    90  	case float32:
    91  		return float64(vv)
    92  	case float64:
    93  		return vv
    94  	case string:
    95  		// if error occurred, return zero value
    96  		f, _ := strconv.ParseFloat(vv, 64)
    97  		return f
    98  	}
    99  	return 0
   100  }
   101  
   102  func (d *Decoder) mergeValueNode(value ast.Node) ast.Node {
   103  	if value.Type() == ast.AliasType {
   104  		aliasNode := value.(*ast.AliasNode)
   105  		aliasName := aliasNode.Value.GetToken().Value
   106  		return d.anchorNodeMap[aliasName]
   107  	}
   108  	return value
   109  }
   110  
   111  func (d *Decoder) mapKeyNodeToString(node ast.Node) string {
   112  	key := d.nodeToValue(node)
   113  	if key == nil {
   114  		return "null"
   115  	}
   116  	if k, ok := key.(string); ok {
   117  		return k
   118  	}
   119  	return fmt.Sprint(key)
   120  }
   121  
   122  func (d *Decoder) setToMapValue(node ast.Node, m map[string]interface{}) {
   123  	switch n := node.(type) {
   124  	case *ast.MappingValueNode:
   125  		if n.Key.Type() == ast.MergeKeyType {
   126  			d.setToMapValue(d.mergeValueNode(n.Value), m)
   127  		} else {
   128  			key := d.mapKeyNodeToString(n.Key)
   129  			m[key] = d.nodeToValue(n.Value)
   130  		}
   131  	case *ast.MappingNode:
   132  		for _, value := range n.Values {
   133  			d.setToMapValue(value, m)
   134  		}
   135  	case *ast.AnchorNode:
   136  		anchorName := n.Name.GetToken().Value
   137  		d.anchorNodeMap[anchorName] = n.Value
   138  	}
   139  }
   140  
   141  func (d *Decoder) setToOrderedMapValue(node ast.Node, m *MapSlice) {
   142  	switch n := node.(type) {
   143  	case *ast.MappingValueNode:
   144  		if n.Key.Type() == ast.MergeKeyType {
   145  			d.setToOrderedMapValue(d.mergeValueNode(n.Value), m)
   146  		} else {
   147  			key := d.mapKeyNodeToString(n.Key)
   148  			*m = append(*m, MapItem{Key: key, Value: d.nodeToValue(n.Value)})
   149  		}
   150  	case *ast.MappingNode:
   151  		for _, value := range n.Values {
   152  			d.setToOrderedMapValue(value, m)
   153  		}
   154  	}
   155  }
   156  
   157  func (d *Decoder) nodeToValue(node ast.Node) interface{} {
   158  	switch n := node.(type) {
   159  	case *ast.NullNode:
   160  		return nil
   161  	case *ast.StringNode:
   162  		return n.GetValue()
   163  	case *ast.IntegerNode:
   164  		return n.GetValue()
   165  	case *ast.FloatNode:
   166  		return n.GetValue()
   167  	case *ast.BoolNode:
   168  		return n.GetValue()
   169  	case *ast.InfinityNode:
   170  		return n.GetValue()
   171  	case *ast.NanNode:
   172  		return n.GetValue()
   173  	case *ast.TagNode:
   174  		switch token.ReservedTagKeyword(n.Start.Value) {
   175  		case token.TimestampTag:
   176  			t, _ := d.castToTime(n.Value)
   177  			return t
   178  		case token.IntegerTag:
   179  			i, _ := strconv.Atoi(fmt.Sprint(d.nodeToValue(n.Value)))
   180  			return i
   181  		case token.FloatTag:
   182  			return d.castToFloat(d.nodeToValue(n.Value))
   183  		case token.NullTag:
   184  			return nil
   185  		case token.BinaryTag:
   186  			b, _ := base64.StdEncoding.DecodeString(d.nodeToValue(n.Value).(string))
   187  			return b
   188  		case token.StringTag:
   189  			return d.nodeToValue(n.Value)
   190  		case token.MappingTag:
   191  			return d.nodeToValue(n.Value)
   192  		}
   193  	case *ast.AnchorNode:
   194  		anchorName := n.Name.GetToken().Value
   195  		anchorValue := d.nodeToValue(n.Value)
   196  		d.anchorNodeMap[anchorName] = n.Value
   197  		return anchorValue
   198  	case *ast.AliasNode:
   199  		aliasName := n.Value.GetToken().Value
   200  		node := d.anchorNodeMap[aliasName]
   201  		return d.nodeToValue(node)
   202  	case *ast.LiteralNode:
   203  		return n.Value.GetValue()
   204  	case *ast.MappingKeyNode:
   205  		return d.nodeToValue(n.Value)
   206  	case *ast.MappingValueNode:
   207  		if n.Key.Type() == ast.MergeKeyType {
   208  			value := d.mergeValueNode(n.Value)
   209  			if d.useOrderedMap {
   210  				m := MapSlice{}
   211  				d.setToOrderedMapValue(value, &m)
   212  				return m
   213  			}
   214  			m := map[string]interface{}{}
   215  			d.setToMapValue(value, m)
   216  			return m
   217  		}
   218  		key := d.mapKeyNodeToString(n.Key)
   219  		if d.useOrderedMap {
   220  			return MapSlice{{Key: key, Value: d.nodeToValue(n.Value)}}
   221  		}
   222  		return map[string]interface{}{
   223  			key: d.nodeToValue(n.Value),
   224  		}
   225  	case *ast.MappingNode:
   226  		if d.useOrderedMap {
   227  			m := make(MapSlice, 0, len(n.Values))
   228  			for _, value := range n.Values {
   229  				d.setToOrderedMapValue(value, &m)
   230  			}
   231  			return m
   232  		}
   233  		m := make(map[string]interface{}, len(n.Values))
   234  		for _, value := range n.Values {
   235  			d.setToMapValue(value, m)
   236  		}
   237  		return m
   238  	case *ast.SequenceNode:
   239  		v := make([]interface{}, 0, len(n.Values))
   240  		for _, value := range n.Values {
   241  			v = append(v, d.nodeToValue(value))
   242  		}
   243  		return v
   244  	}
   245  	return nil
   246  }
   247  
   248  func (d *Decoder) resolveAlias(node ast.Node) ast.Node {
   249  	switch n := node.(type) {
   250  	case *ast.MappingNode:
   251  		for idx, value := range n.Values {
   252  			n.Values[idx] = d.resolveAlias(value).(*ast.MappingValueNode)
   253  		}
   254  	case *ast.TagNode:
   255  		n.Value = d.resolveAlias(n.Value)
   256  	case *ast.MappingKeyNode:
   257  		n.Value = d.resolveAlias(n.Value)
   258  	case *ast.MappingValueNode:
   259  		if n.Key.Type() == ast.MergeKeyType && n.Value.Type() == ast.AliasType {
   260  			value := d.resolveAlias(n.Value)
   261  			keyColumn := n.Key.GetToken().Position.Column
   262  			requiredColumn := keyColumn + 2
   263  			value.AddColumn(requiredColumn)
   264  			n.Value = value
   265  		} else {
   266  			n.Key = d.resolveAlias(n.Key)
   267  			n.Value = d.resolveAlias(n.Value)
   268  		}
   269  	case *ast.SequenceNode:
   270  		for idx, value := range n.Values {
   271  			n.Values[idx] = d.resolveAlias(value)
   272  		}
   273  	case *ast.AliasNode:
   274  		aliasName := n.Value.GetToken().Value
   275  		return d.resolveAlias(d.anchorNodeMap[aliasName])
   276  	}
   277  	return node
   278  }
   279  
   280  func (d *Decoder) getMapNode(node ast.Node) (ast.MapNode, error) {
   281  	if _, ok := node.(*ast.NullNode); ok {
   282  		return nil, nil
   283  	}
   284  	if anchor, ok := node.(*ast.AnchorNode); ok {
   285  		mapNode, ok := anchor.Value.(ast.MapNode)
   286  		if ok {
   287  			return mapNode, nil
   288  		}
   289  		return nil, errUnexpectedNodeType(anchor.Value.Type(), ast.MappingType, node.GetToken())
   290  	}
   291  	if alias, ok := node.(*ast.AliasNode); ok {
   292  		aliasName := alias.Value.GetToken().Value
   293  		node := d.anchorNodeMap[aliasName]
   294  		if node == nil {
   295  			return nil, xerrors.Errorf("cannot find anchor by alias name %s", aliasName)
   296  		}
   297  		mapNode, ok := node.(ast.MapNode)
   298  		if ok {
   299  			return mapNode, nil
   300  		}
   301  		return nil, errUnexpectedNodeType(node.Type(), ast.MappingType, node.GetToken())
   302  	}
   303  	mapNode, ok := node.(ast.MapNode)
   304  	if !ok {
   305  		return nil, errUnexpectedNodeType(node.Type(), ast.MappingType, node.GetToken())
   306  	}
   307  	return mapNode, nil
   308  }
   309  
   310  func (d *Decoder) getArrayNode(node ast.Node) (ast.ArrayNode, error) {
   311  	if _, ok := node.(*ast.NullNode); ok {
   312  		return nil, nil
   313  	}
   314  	if anchor, ok := node.(*ast.AnchorNode); ok {
   315  		arrayNode, ok := anchor.Value.(ast.ArrayNode)
   316  		if ok {
   317  			return arrayNode, nil
   318  		}
   319  
   320  		return nil, errUnexpectedNodeType(anchor.Value.Type(), ast.SequenceType, node.GetToken())
   321  	}
   322  	if alias, ok := node.(*ast.AliasNode); ok {
   323  		aliasName := alias.Value.GetToken().Value
   324  		node := d.anchorNodeMap[aliasName]
   325  		if node == nil {
   326  			return nil, xerrors.Errorf("cannot find anchor by alias name %s", aliasName)
   327  		}
   328  		arrayNode, ok := node.(ast.ArrayNode)
   329  		if ok {
   330  			return arrayNode, nil
   331  		}
   332  		return nil, errUnexpectedNodeType(node.Type(), ast.SequenceType, node.GetToken())
   333  	}
   334  	arrayNode, ok := node.(ast.ArrayNode)
   335  	if !ok {
   336  		return nil, errUnexpectedNodeType(node.Type(), ast.SequenceType, node.GetToken())
   337  	}
   338  	return arrayNode, nil
   339  }
   340  
   341  func (d *Decoder) fileToNode(f *ast.File) ast.Node {
   342  	for _, doc := range f.Docs {
   343  		if v := d.nodeToValue(doc.Body); v != nil {
   344  			return doc.Body
   345  		}
   346  	}
   347  	return nil
   348  }
   349  
   350  func (d *Decoder) convertValue(v reflect.Value, typ reflect.Type) (reflect.Value, error) {
   351  	if typ.Kind() != reflect.String {
   352  		if !v.Type().ConvertibleTo(typ) {
   353  			return reflect.Zero(typ), errTypeMismatch(typ, v.Type())
   354  		}
   355  		return v.Convert(typ), nil
   356  	}
   357  	// cast value to string
   358  	switch v.Type().Kind() {
   359  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   360  		return reflect.ValueOf(fmt.Sprint(v.Int())), nil
   361  	case reflect.Float32, reflect.Float64:
   362  		return reflect.ValueOf(fmt.Sprint(v.Float())), nil
   363  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
   364  		return reflect.ValueOf(fmt.Sprint(v.Uint())), nil
   365  	case reflect.Bool:
   366  		return reflect.ValueOf(fmt.Sprint(v.Bool())), nil
   367  	}
   368  	if !v.Type().ConvertibleTo(typ) {
   369  		return reflect.Zero(typ), errTypeMismatch(typ, v.Type())
   370  	}
   371  	return v.Convert(typ), nil
   372  }
   373  
   374  type overflowError struct {
   375  	dstType reflect.Type
   376  	srcNum  string
   377  }
   378  
   379  func (e *overflowError) Error() string {
   380  	return fmt.Sprintf("cannot unmarshal %s into Go value of type %s ( overflow )", e.srcNum, e.dstType)
   381  }
   382  
   383  func errOverflow(dstType reflect.Type, num string) *overflowError {
   384  	return &overflowError{dstType: dstType, srcNum: num}
   385  }
   386  
   387  type typeError struct {
   388  	dstType         reflect.Type
   389  	srcType         reflect.Type
   390  	structFieldName *string
   391  }
   392  
   393  func (e *typeError) Error() string {
   394  	if e.structFieldName != nil {
   395  		return fmt.Sprintf("cannot unmarshal %s into Go struct field %s of type %s", e.srcType, *e.structFieldName, e.dstType)
   396  	}
   397  	return fmt.Sprintf("cannot unmarshal %s into Go value of type %s", e.srcType, e.dstType)
   398  }
   399  
   400  func errTypeMismatch(dstType, srcType reflect.Type) *typeError {
   401  	return &typeError{dstType: dstType, srcType: srcType}
   402  }
   403  
   404  type unknownFieldError struct {
   405  	err error
   406  }
   407  
   408  func (e *unknownFieldError) Error() string {
   409  	return e.err.Error()
   410  }
   411  
   412  func errUnknownField(msg string, tk *token.Token) *unknownFieldError {
   413  	return &unknownFieldError{err: errors.ErrSyntax(msg, tk)}
   414  }
   415  
   416  func errUnexpectedNodeType(actual, expected ast.NodeType, tk *token.Token) error {
   417  	return errors.ErrSyntax(fmt.Sprintf("%s was used where %s is expected", actual.YAMLName(), expected.YAMLName()), tk)
   418  }
   419  
   420  type duplicateKeyError struct {
   421  	err error
   422  }
   423  
   424  func (e *duplicateKeyError) Error() string {
   425  	return e.err.Error()
   426  }
   427  
   428  func errDuplicateKey(msg string, tk *token.Token) *duplicateKeyError {
   429  	return &duplicateKeyError{err: errors.ErrSyntax(msg, tk)}
   430  }
   431  
   432  func (d *Decoder) deleteStructKeys(structType reflect.Type, unknownFields map[string]ast.Node) error {
   433  	if structType.Kind() == reflect.Ptr {
   434  		structType = structType.Elem()
   435  	}
   436  	structFieldMap, err := structFieldMap(structType)
   437  	if err != nil {
   438  		return errors.Wrapf(err, "failed to create struct field map")
   439  	}
   440  
   441  	for j := 0; j < structType.NumField(); j++ {
   442  		field := structType.Field(j)
   443  		if isIgnoredStructField(field) {
   444  			continue
   445  		}
   446  
   447  		structField, exists := structFieldMap[field.Name]
   448  		if !exists {
   449  			continue
   450  		}
   451  
   452  		if structField.IsInline {
   453  			d.deleteStructKeys(field.Type, unknownFields)
   454  		} else {
   455  			delete(unknownFields, structField.RenderName)
   456  		}
   457  	}
   458  	return nil
   459  }
   460  
   461  func (d *Decoder) lastNode(node ast.Node) ast.Node {
   462  	switch n := node.(type) {
   463  	case *ast.MappingNode:
   464  		if len(n.Values) > 0 {
   465  			return d.lastNode(n.Values[len(n.Values)-1])
   466  		}
   467  	case *ast.MappingValueNode:
   468  		return d.lastNode(n.Value)
   469  	case *ast.SequenceNode:
   470  		if len(n.Values) > 0 {
   471  			return d.lastNode(n.Values[len(n.Values)-1])
   472  		}
   473  	}
   474  	return node
   475  }
   476  
   477  func (d *Decoder) unmarshalableDocument(node ast.Node) []byte {
   478  	node = d.resolveAlias(node)
   479  	doc := node.String()
   480  	last := d.lastNode(node)
   481  	if last != nil && last.Type() == ast.LiteralType {
   482  		doc += "\n"
   483  	}
   484  	return []byte(doc)
   485  }
   486  
   487  func (d *Decoder) unmarshalableText(node ast.Node) ([]byte, bool) {
   488  	node = d.resolveAlias(node)
   489  	if node.Type() == ast.AnchorType {
   490  		node = node.(*ast.AnchorNode).Value
   491  	}
   492  	switch n := node.(type) {
   493  	case *ast.StringNode:
   494  		return []byte(n.Value), true
   495  	case *ast.LiteralNode:
   496  		return []byte(n.Value.GetToken().Value), true
   497  	default:
   498  		scalar, ok := n.(ast.ScalarNode)
   499  		if ok {
   500  			return []byte(fmt.Sprint(scalar.GetValue())), true
   501  		}
   502  	}
   503  	return nil, false
   504  }
   505  
   506  type jsonUnmarshaler interface {
   507  	UnmarshalJSON([]byte) error
   508  }
   509  
   510  func (d *Decoder) canDecodeByUnmarshaler(dst reflect.Value) bool {
   511  	iface := dst.Addr().Interface()
   512  	switch iface.(type) {
   513  	case BytesUnmarshalerContext:
   514  		return true
   515  	case BytesUnmarshaler:
   516  		return true
   517  	case InterfaceUnmarshalerContext:
   518  		return true
   519  	case InterfaceUnmarshaler:
   520  		return true
   521  	case *time.Time:
   522  		return true
   523  	case *time.Duration:
   524  		return true
   525  	case encoding.TextUnmarshaler:
   526  		return true
   527  	case jsonUnmarshaler:
   528  		return d.useJSONUnmarshaler
   529  	}
   530  	return false
   531  }
   532  
   533  func (d *Decoder) decodeByUnmarshaler(ctx context.Context, dst reflect.Value, src ast.Node) error {
   534  	iface := dst.Addr().Interface()
   535  
   536  	if unmarshaler, ok := iface.(BytesUnmarshalerContext); ok {
   537  		if err := unmarshaler.UnmarshalYAML(ctx, d.unmarshalableDocument(src)); err != nil {
   538  			return errors.Wrapf(err, "failed to UnmarshalYAML")
   539  		}
   540  		return nil
   541  	}
   542  
   543  	if unmarshaler, ok := iface.(BytesUnmarshaler); ok {
   544  		if err := unmarshaler.UnmarshalYAML(d.unmarshalableDocument(src)); err != nil {
   545  			return errors.Wrapf(err, "failed to UnmarshalYAML")
   546  		}
   547  		return nil
   548  	}
   549  
   550  	if unmarshaler, ok := iface.(InterfaceUnmarshalerContext); ok {
   551  		if err := unmarshaler.UnmarshalYAML(ctx, func(v interface{}) error {
   552  			rv := reflect.ValueOf(v)
   553  			if rv.Type().Kind() != reflect.Ptr {
   554  				return errors.ErrDecodeRequiredPointerType
   555  			}
   556  			if err := d.decodeValue(ctx, rv.Elem(), src); err != nil {
   557  				return errors.Wrapf(err, "failed to decode value")
   558  			}
   559  			return nil
   560  		}); err != nil {
   561  			return errors.Wrapf(err, "failed to UnmarshalYAML")
   562  		}
   563  		return nil
   564  	}
   565  
   566  	if unmarshaler, ok := iface.(InterfaceUnmarshaler); ok {
   567  		if err := unmarshaler.UnmarshalYAML(func(v interface{}) error {
   568  			rv := reflect.ValueOf(v)
   569  			if rv.Type().Kind() != reflect.Ptr {
   570  				return errors.ErrDecodeRequiredPointerType
   571  			}
   572  			if err := d.decodeValue(ctx, rv.Elem(), src); err != nil {
   573  				return errors.Wrapf(err, "failed to decode value")
   574  			}
   575  			return nil
   576  		}); err != nil {
   577  			return errors.Wrapf(err, "failed to UnmarshalYAML")
   578  		}
   579  		return nil
   580  	}
   581  
   582  	if _, ok := iface.(*time.Time); ok {
   583  		return d.decodeTime(ctx, dst, src)
   584  	}
   585  
   586  	if _, ok := iface.(*time.Duration); ok {
   587  		return d.decodeDuration(ctx, dst, src)
   588  	}
   589  
   590  	if unmarshaler, isText := iface.(encoding.TextUnmarshaler); isText {
   591  		b, ok := d.unmarshalableText(src)
   592  		if ok {
   593  			if err := unmarshaler.UnmarshalText(b); err != nil {
   594  				return errors.Wrapf(err, "failed to UnmarshalText")
   595  			}
   596  			return nil
   597  		}
   598  	}
   599  
   600  	if d.useJSONUnmarshaler {
   601  		if unmarshaler, ok := iface.(jsonUnmarshaler); ok {
   602  			jsonBytes, err := YAMLToJSON(d.unmarshalableDocument(src))
   603  			if err != nil {
   604  				return errors.Wrapf(err, "failed to convert yaml to json")
   605  			}
   606  			jsonBytes = bytes.TrimRight(jsonBytes, "\n")
   607  			if err := unmarshaler.UnmarshalJSON(jsonBytes); err != nil {
   608  				return errors.Wrapf(err, "failed to UnmarshalJSON")
   609  			}
   610  			return nil
   611  		}
   612  	}
   613  
   614  	return xerrors.Errorf("does not implemented Unmarshaler")
   615  }
   616  
   617  var astNodeType = reflect.TypeOf((*ast.Node)(nil)).Elem()
   618  
   619  func (d *Decoder) decodeValue(ctx context.Context, dst reflect.Value, src ast.Node) error {
   620  	if src.Type() == ast.AnchorType {
   621  		anchorName := src.(*ast.AnchorNode).Name.GetToken().Value
   622  		if _, exists := d.anchorValueMap[anchorName]; !exists {
   623  			d.anchorValueMap[anchorName] = dst
   624  		}
   625  	}
   626  	if d.canDecodeByUnmarshaler(dst) {
   627  		if err := d.decodeByUnmarshaler(ctx, dst, src); err != nil {
   628  			return errors.Wrapf(err, "failed to decode by unmarshaler")
   629  		}
   630  		return nil
   631  	}
   632  	valueType := dst.Type()
   633  	switch valueType.Kind() {
   634  	case reflect.Ptr:
   635  		if dst.IsNil() {
   636  			return nil
   637  		}
   638  		if src.Type() == ast.NullType {
   639  			// set nil value to pointer
   640  			dst.Set(reflect.Zero(valueType))
   641  			return nil
   642  		}
   643  		v := d.createDecodableValue(dst.Type())
   644  		if err := d.decodeValue(ctx, v, src); err != nil {
   645  			return errors.Wrapf(err, "failed to decode ptr value")
   646  		}
   647  		dst.Set(d.castToAssignableValue(v, dst.Type()))
   648  	case reflect.Interface:
   649  		if dst.Type() == astNodeType {
   650  			dst.Set(reflect.ValueOf(src))
   651  			return nil
   652  		}
   653  		v := reflect.ValueOf(d.nodeToValue(src))
   654  		if v.IsValid() {
   655  			dst.Set(v)
   656  		}
   657  	case reflect.Map:
   658  		return d.decodeMap(ctx, dst, src)
   659  	case reflect.Array:
   660  		return d.decodeArray(ctx, dst, src)
   661  	case reflect.Slice:
   662  		if mapSlice, ok := dst.Addr().Interface().(*MapSlice); ok {
   663  			return d.decodeMapSlice(ctx, mapSlice, src)
   664  		}
   665  		return d.decodeSlice(ctx, dst, src)
   666  	case reflect.Struct:
   667  		if mapItem, ok := dst.Addr().Interface().(*MapItem); ok {
   668  			return d.decodeMapItem(ctx, mapItem, src)
   669  		}
   670  		return d.decodeStruct(ctx, dst, src)
   671  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   672  		v := d.nodeToValue(src)
   673  		switch vv := v.(type) {
   674  		case int64:
   675  			if !dst.OverflowInt(vv) {
   676  				dst.SetInt(vv)
   677  				return nil
   678  			}
   679  		case uint64:
   680  			if vv <= math.MaxInt64 && !dst.OverflowInt(int64(vv)) {
   681  				dst.SetInt(int64(vv))
   682  				return nil
   683  			}
   684  		case float64:
   685  			if vv <= math.MaxInt64 && !dst.OverflowInt(int64(vv)) {
   686  				dst.SetInt(int64(vv))
   687  				return nil
   688  			}
   689  		default:
   690  			return errTypeMismatch(valueType, reflect.TypeOf(v))
   691  		}
   692  		return errOverflow(valueType, fmt.Sprint(v))
   693  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
   694  		v := d.nodeToValue(src)
   695  		switch vv := v.(type) {
   696  		case int64:
   697  			if 0 <= vv && !dst.OverflowUint(uint64(vv)) {
   698  				dst.SetUint(uint64(vv))
   699  				return nil
   700  			}
   701  		case uint64:
   702  			if !dst.OverflowUint(vv) {
   703  				dst.SetUint(vv)
   704  				return nil
   705  			}
   706  		case float64:
   707  			if 0 <= vv && vv <= math.MaxUint64 && !dst.OverflowUint(uint64(vv)) {
   708  				dst.SetUint(uint64(vv))
   709  				return nil
   710  			}
   711  		default:
   712  			return errTypeMismatch(valueType, reflect.TypeOf(v))
   713  		}
   714  		return errOverflow(valueType, fmt.Sprint(v))
   715  	}
   716  	v := reflect.ValueOf(d.nodeToValue(src))
   717  	if v.IsValid() {
   718  		convertedValue, err := d.convertValue(v, dst.Type())
   719  		if err != nil {
   720  			return errors.Wrapf(err, "failed to convert value")
   721  		}
   722  		dst.Set(convertedValue)
   723  	}
   724  	return nil
   725  }
   726  
   727  func (d *Decoder) createDecodableValue(typ reflect.Type) reflect.Value {
   728  	for {
   729  		if typ.Kind() == reflect.Ptr {
   730  			typ = typ.Elem()
   731  			continue
   732  		}
   733  		break
   734  	}
   735  	return reflect.New(typ).Elem()
   736  }
   737  
   738  func (d *Decoder) castToAssignableValue(value reflect.Value, target reflect.Type) reflect.Value {
   739  	if target.Kind() != reflect.Ptr {
   740  		return value
   741  	}
   742  	maxTryCount := 5
   743  	tryCount := 0
   744  	for {
   745  		if tryCount > maxTryCount {
   746  			return value
   747  		}
   748  		if value.Type().AssignableTo(target) {
   749  			break
   750  		}
   751  		value = value.Addr()
   752  		tryCount++
   753  	}
   754  	return value
   755  }
   756  
   757  func (d *Decoder) createDecodedNewValue(ctx context.Context, typ reflect.Type, node ast.Node, label string) (reflect.Value, error) {
   758  	if node.Type() == ast.AliasType {
   759  		aliasName := node.(*ast.AliasNode).Value.GetToken().Value
   760  		newValue := d.anchorValueMap[aliasName]
   761  		if newValue.IsValid() {
   762  			return newValue, nil
   763  		}
   764  	}
   765  	if node.Type() == ast.NullType {
   766  		return reflect.Zero(typ), nil
   767  	}
   768  
   769  	if f, ok := d.typeDecoderMap[typ]; ok {
   770  		v, err := f(node, typ)
   771  		if err == nil || err != ErrContinue {
   772  			return v, err
   773  		}
   774  	}
   775  
   776  	if label != "" {
   777  		if f, ok := d.labelDecoderMap[label]; ok {
   778  			v, err := f(node, typ)
   779  			if err == nil || err != ErrContinue {
   780  				return v, err
   781  			}
   782  		}
   783  	}
   784  
   785  	newValue := d.createDecodableValue(typ)
   786  	if err := d.decodeValue(ctx, newValue, node); err != nil {
   787  		return newValue, errors.Wrapf(err, "failed to decode value")
   788  	}
   789  	return newValue, nil
   790  }
   791  
   792  func (d *Decoder) keyToNodeMap(node ast.Node, ignoreMergeKey bool, getKeyOrValueNode func(*ast.MapNodeIter) ast.Node) (map[string]ast.Node, error) {
   793  	mapNode, err := d.getMapNode(node)
   794  	if err != nil {
   795  		return nil, errors.Wrapf(err, "failed to get map node")
   796  	}
   797  	keyMap := map[string]struct{}{}
   798  	keyToNodeMap := map[string]ast.Node{}
   799  	if mapNode == nil {
   800  		return keyToNodeMap, nil
   801  	}
   802  	mapIter := mapNode.MapRange()
   803  	for mapIter.Next() {
   804  		keyNode := mapIter.Key()
   805  		if keyNode.Type() == ast.MergeKeyType {
   806  			if ignoreMergeKey {
   807  				continue
   808  			}
   809  			mergeMap, err := d.keyToNodeMap(mapIter.Value(), ignoreMergeKey, getKeyOrValueNode)
   810  			if err != nil {
   811  				return nil, errors.Wrapf(err, "failed to get keyToNodeMap by MergeKey node")
   812  			}
   813  			for k, v := range mergeMap {
   814  				if err := d.validateDuplicateKey(keyMap, k, v); err != nil {
   815  					return nil, errors.Wrapf(err, "invalid struct key")
   816  				}
   817  				keyToNodeMap[k] = v
   818  			}
   819  		} else {
   820  			key, ok := d.nodeToValue(keyNode).(string)
   821  			if !ok {
   822  				return nil, errors.Wrapf(err, "failed to decode map key")
   823  			}
   824  			if err := d.validateDuplicateKey(keyMap, key, keyNode); err != nil {
   825  				return nil, errors.Wrapf(err, "invalid struct key")
   826  			}
   827  			keyToNodeMap[key] = getKeyOrValueNode(mapIter)
   828  		}
   829  	}
   830  	return keyToNodeMap, nil
   831  }
   832  
   833  func (d *Decoder) keyToKeyNodeMap(node ast.Node, ignoreMergeKey bool) (map[string]ast.Node, error) {
   834  	m, err := d.keyToNodeMap(node, ignoreMergeKey, func(nodeMap *ast.MapNodeIter) ast.Node { return nodeMap.Key() })
   835  	if err != nil {
   836  		return nil, errors.Wrapf(err, "failed to get keyToNodeMap")
   837  	}
   838  	return m, nil
   839  }
   840  
   841  func (d *Decoder) keyToValueNodeMap(node ast.Node, ignoreMergeKey bool) (map[string]ast.Node, error) {
   842  	m, err := d.keyToNodeMap(node, ignoreMergeKey, func(nodeMap *ast.MapNodeIter) ast.Node { return nodeMap.Value() })
   843  	if err != nil {
   844  		return nil, errors.Wrapf(err, "failed to get keyToNodeMap")
   845  	}
   846  	return m, nil
   847  }
   848  
   849  func (d *Decoder) setDefaultValueIfConflicted(v reflect.Value, fieldMap StructFieldMap) error {
   850  	typ := v.Type()
   851  	if typ.Kind() != reflect.Struct {
   852  		return nil
   853  	}
   854  	embeddedStructFieldMap, err := structFieldMap(typ)
   855  	if err != nil {
   856  		return errors.Wrapf(err, "failed to get struct field map by embedded type")
   857  	}
   858  	for i := 0; i < typ.NumField(); i++ {
   859  		field := typ.Field(i)
   860  		if isIgnoredStructField(field) {
   861  			continue
   862  		}
   863  		structField := embeddedStructFieldMap[field.Name]
   864  		if !fieldMap.isIncludedRenderName(structField.RenderName) {
   865  			continue
   866  		}
   867  		// if declared same key name, set default value
   868  		fieldValue := v.Field(i)
   869  		if fieldValue.CanSet() {
   870  			fieldValue.Set(reflect.Zero(fieldValue.Type()))
   871  		}
   872  	}
   873  	return nil
   874  }
   875  
   876  // This is a subset of the formats allowed by the regular expression
   877  // defined at http://yaml.org/type/timestamp.html.
   878  var allowedTimestampFormats = []string{
   879  	"2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields.
   880  	"2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t".
   881  	"2006-1-2 15:4:5.999999999",       // space separated with no time zone
   882  	"2006-1-2",                        // date only
   883  }
   884  
   885  func (d *Decoder) castToTime(src ast.Node) (time.Time, error) {
   886  	if src == nil {
   887  		return time.Time{}, nil
   888  	}
   889  	v := d.nodeToValue(src)
   890  	if t, ok := v.(time.Time); ok {
   891  		return t, nil
   892  	}
   893  	s, ok := v.(string)
   894  	if !ok {
   895  		return time.Time{}, errTypeMismatch(reflect.TypeOf(time.Time{}), reflect.TypeOf(v))
   896  	}
   897  	for _, format := range allowedTimestampFormats {
   898  		t, err := time.Parse(format, s)
   899  		if err != nil {
   900  			// invalid format
   901  			continue
   902  		}
   903  		return t, nil
   904  	}
   905  	return time.Time{}, nil
   906  }
   907  
   908  func (d *Decoder) decodeTime(ctx context.Context, dst reflect.Value, src ast.Node) error {
   909  	t, err := d.castToTime(src)
   910  	if err != nil {
   911  		return errors.Wrapf(err, "failed to convert to time")
   912  	}
   913  	dst.Set(reflect.ValueOf(t))
   914  	return nil
   915  }
   916  
   917  func (d *Decoder) castToDuration(src ast.Node) (time.Duration, error) {
   918  	if src == nil {
   919  		return 0, nil
   920  	}
   921  	v := d.nodeToValue(src)
   922  	if t, ok := v.(time.Duration); ok {
   923  		return t, nil
   924  	}
   925  
   926  	if u, ok := v.(uint64); ok {
   927  		return time.Duration(u), nil
   928  	}
   929  
   930  	s, ok := v.(string)
   931  	if !ok {
   932  		return 0, errTypeMismatch(reflect.TypeOf(time.Duration(0)), reflect.TypeOf(v))
   933  	}
   934  	t, err := time.ParseDuration(s)
   935  	if err != nil {
   936  		return 0, errors.Wrapf(err, "failed to parse duration")
   937  	}
   938  	return t, nil
   939  }
   940  
   941  func (d *Decoder) decodeDuration(ctx context.Context, dst reflect.Value, src ast.Node) error {
   942  	t, err := d.castToDuration(src)
   943  	if err != nil {
   944  		return errors.Wrapf(err, "failed to convert to duration")
   945  	}
   946  	dst.Set(reflect.ValueOf(t))
   947  	return nil
   948  }
   949  
   950  // getMergeAliasName support single alias only
   951  func (d *Decoder) getMergeAliasName(src ast.Node) string {
   952  	mapNode, err := d.getMapNode(src)
   953  	if err != nil {
   954  		return ""
   955  	}
   956  	if mapNode == nil {
   957  		return ""
   958  	}
   959  	mapIter := mapNode.MapRange()
   960  	for mapIter.Next() {
   961  		key := mapIter.Key()
   962  		value := mapIter.Value()
   963  		if key.Type() == ast.MergeKeyType && value.Type() == ast.AliasType {
   964  			return value.(*ast.AliasNode).Value.GetToken().Value
   965  		}
   966  	}
   967  	return ""
   968  }
   969  
   970  func (d *Decoder) decodeStruct(ctx context.Context, dst reflect.Value, src ast.Node) error {
   971  	if src == nil {
   972  		return nil
   973  	}
   974  	structType := dst.Type()
   975  	srcValue := reflect.ValueOf(src)
   976  	srcType := srcValue.Type()
   977  	if srcType.Kind() == reflect.Ptr {
   978  		srcType = srcType.Elem()
   979  		srcValue = srcValue.Elem()
   980  	}
   981  	if structType == srcType {
   982  		// dst value implements ast.Node
   983  		dst.Set(srcValue)
   984  		return nil
   985  	}
   986  	structFieldMap, err := structFieldMap(structType)
   987  	if err != nil {
   988  		return errors.Wrapf(err, "failed to create struct field map")
   989  	}
   990  	ignoreMergeKey := structFieldMap.hasMergeProperty()
   991  	keyToNodeMap, err := d.keyToValueNodeMap(src, ignoreMergeKey)
   992  	if err != nil {
   993  		return errors.Wrapf(err, "failed to get keyToValueNodeMap")
   994  	}
   995  	var unknownFields map[string]ast.Node
   996  	if d.disallowUnknownField {
   997  		unknownFields, err = d.keyToKeyNodeMap(src, ignoreMergeKey)
   998  		if err != nil {
   999  			return errors.Wrapf(err, "failed to get keyToKeyNodeMap")
  1000  		}
  1001  	}
  1002  
  1003  	aliasName := d.getMergeAliasName(src)
  1004  	var foundErr error
  1005  
  1006  	for i := 0; i < structType.NumField(); i++ {
  1007  		field := structType.Field(i)
  1008  		if isIgnoredStructField(field) {
  1009  			continue
  1010  		}
  1011  		structField := structFieldMap[field.Name]
  1012  		if structField.IsInline {
  1013  			fieldValue := dst.FieldByName(field.Name)
  1014  			if structField.IsAutoAlias {
  1015  				if aliasName != "" {
  1016  					newFieldValue := d.anchorValueMap[aliasName]
  1017  					if newFieldValue.IsValid() {
  1018  						fieldValue.Set(d.castToAssignableValue(newFieldValue, fieldValue.Type()))
  1019  					}
  1020  				}
  1021  				continue
  1022  			}
  1023  			if !fieldValue.CanSet() {
  1024  				return xerrors.Errorf("cannot set embedded type as unexported field %s.%s", field.PkgPath, field.Name)
  1025  			}
  1026  			if fieldValue.Type().Kind() == reflect.Ptr && src.Type() == ast.NullType {
  1027  				// set nil value to pointer
  1028  				fieldValue.Set(reflect.Zero(fieldValue.Type()))
  1029  				continue
  1030  			}
  1031  			mapNode := ast.Mapping(nil, false)
  1032  			for k, v := range keyToNodeMap {
  1033  				key := &ast.StringNode{BaseNode: &ast.BaseNode{}, Value: k}
  1034  				mapNode.Values = append(mapNode.Values, ast.MappingValue(nil, key, v))
  1035  			}
  1036  			newFieldValue, err := d.createDecodedNewValue(ctx, fieldValue.Type(), mapNode, structField.Label)
  1037  			if d.disallowUnknownField {
  1038  				if err := d.deleteStructKeys(fieldValue.Type(), unknownFields); err != nil {
  1039  					return errors.Wrapf(err, "cannot delete struct keys")
  1040  				}
  1041  			}
  1042  
  1043  			if err != nil {
  1044  				if foundErr != nil {
  1045  					continue
  1046  				}
  1047  				var te *typeError
  1048  				if xerrors.As(err, &te) {
  1049  					if te.structFieldName != nil {
  1050  						fieldName := fmt.Sprintf("%s.%s", structType.Name(), *te.structFieldName)
  1051  						te.structFieldName = &fieldName
  1052  					} else {
  1053  						fieldName := fmt.Sprintf("%s.%s", structType.Name(), field.Name)
  1054  						te.structFieldName = &fieldName
  1055  					}
  1056  					foundErr = te
  1057  					continue
  1058  				} else {
  1059  					foundErr = err
  1060  				}
  1061  				continue
  1062  			}
  1063  			d.setDefaultValueIfConflicted(newFieldValue, structFieldMap)
  1064  			fieldValue.Set(d.castToAssignableValue(newFieldValue, fieldValue.Type()))
  1065  			continue
  1066  		}
  1067  		renderName := structField.RenderName
  1068  		v, exists := keyToNodeMap[renderName]
  1069  		if !exists {
  1070  			if structField.RenderNameFromTag {
  1071  				continue
  1072  			}
  1073  
  1074  			for k, n := range keyToNodeMap {
  1075  				if strings.ToLower(strings.ReplaceAll(k, "-", "")) == renderName {
  1076  					renderName = k
  1077  					v = n
  1078  					exists = true
  1079  					break
  1080  				}
  1081  			}
  1082  
  1083  			if !exists {
  1084  				continue
  1085  			}
  1086  		}
  1087  		delete(unknownFields, renderName)
  1088  		fieldValue := dst.FieldByName(field.Name)
  1089  		if fieldValue.Type().Kind() == reflect.Ptr && src.Type() == ast.NullType {
  1090  			// set nil value to pointer
  1091  			fieldValue.Set(reflect.Zero(fieldValue.Type()))
  1092  			continue
  1093  		}
  1094  		newFieldValue, err := d.createDecodedNewValue(ctx, fieldValue.Type(), v, structField.Label)
  1095  		if err != nil {
  1096  			if foundErr != nil {
  1097  				continue
  1098  			}
  1099  			var te *typeError
  1100  			if xerrors.As(err, &te) {
  1101  				fieldName := fmt.Sprintf("%s.%s", structType.Name(), field.Name)
  1102  				te.structFieldName = &fieldName
  1103  				foundErr = te
  1104  			} else {
  1105  				foundErr = err
  1106  			}
  1107  			continue
  1108  		}
  1109  		fieldValue.Set(d.castToAssignableValue(newFieldValue, fieldValue.Type()))
  1110  	}
  1111  	if foundErr != nil {
  1112  		return errors.Wrapf(foundErr, "failed to decode value")
  1113  	}
  1114  
  1115  	// Ignore unknown fields when parsing an inline struct (recognized by a nil token).
  1116  	// Unknown fields are expected (they could be fields from the parent struct).
  1117  	if len(unknownFields) != 0 && d.disallowUnknownField && src.GetToken() != nil {
  1118  		for key, node := range unknownFields {
  1119  			return errUnknownField(fmt.Sprintf(`unknown field "%s"`, key), node.GetToken())
  1120  		}
  1121  	}
  1122  
  1123  	if d.validator != nil {
  1124  		if err := d.validator.Struct(dst.Interface()); err != nil {
  1125  			ev := reflect.ValueOf(err)
  1126  			if ev.Type().Kind() == reflect.Slice {
  1127  				for i := 0; i < ev.Len(); i++ {
  1128  					fieldErr, ok := ev.Index(i).Interface().(FieldError)
  1129  					if !ok {
  1130  						continue
  1131  					}
  1132  					fieldName := fieldErr.StructField()
  1133  					structField, exists := structFieldMap[fieldName]
  1134  					if !exists {
  1135  						continue
  1136  					}
  1137  					node, exists := keyToNodeMap[structField.RenderName]
  1138  					if exists {
  1139  						// TODO: to make FieldError message cutomizable
  1140  						return errors.ErrSyntax(fmt.Sprintf("%s", err), node.GetToken())
  1141  					} else if t := src.GetToken(); t != nil && t.Prev != nil && t.Prev.Prev != nil {
  1142  						// A missing required field will not be in the keyToNodeMap
  1143  						// the error needs to be associated with the parent of the source node
  1144  						return errors.ErrSyntax(fmt.Sprintf("%s", err), t.Prev.Prev)
  1145  					}
  1146  				}
  1147  			}
  1148  			return err
  1149  		}
  1150  	}
  1151  	return nil
  1152  }
  1153  
  1154  func (d *Decoder) decodeArray(ctx context.Context, dst reflect.Value, src ast.Node) error {
  1155  	arrayNode, err := d.getArrayNode(src)
  1156  	if err != nil {
  1157  		return errors.Wrapf(err, "failed to get array node")
  1158  	}
  1159  	if arrayNode == nil {
  1160  		return nil
  1161  	}
  1162  	iter := arrayNode.ArrayRange()
  1163  	arrayValue := reflect.New(dst.Type()).Elem()
  1164  	arrayType := dst.Type()
  1165  	elemType := arrayType.Elem()
  1166  	idx := 0
  1167  
  1168  	var foundErr error
  1169  	for iter.Next() {
  1170  		v := iter.Value()
  1171  		if elemType.Kind() == reflect.Ptr && v.Type() == ast.NullType {
  1172  			// set nil value to pointer
  1173  			arrayValue.Index(idx).Set(reflect.Zero(elemType))
  1174  		} else {
  1175  			dstValue, err := d.createDecodedNewValue(ctx, elemType, v, "")
  1176  			if err != nil {
  1177  				if foundErr == nil {
  1178  					foundErr = err
  1179  				}
  1180  				continue
  1181  			} else {
  1182  				arrayValue.Index(idx).Set(d.castToAssignableValue(dstValue, elemType))
  1183  			}
  1184  		}
  1185  		idx++
  1186  	}
  1187  	dst.Set(arrayValue)
  1188  	if foundErr != nil {
  1189  		return errors.Wrapf(foundErr, "failed to decode value")
  1190  	}
  1191  	return nil
  1192  }
  1193  
  1194  func (d *Decoder) decodeSlice(ctx context.Context, dst reflect.Value, src ast.Node) error {
  1195  	arrayNode, err := d.getArrayNode(src)
  1196  	if err != nil {
  1197  		return errors.Wrapf(err, "failed to get array node")
  1198  	}
  1199  	if arrayNode == nil {
  1200  		return nil
  1201  	}
  1202  	iter := arrayNode.ArrayRange()
  1203  	sliceType := dst.Type()
  1204  	sliceValue := reflect.MakeSlice(sliceType, 0, iter.Len())
  1205  	elemType := sliceType.Elem()
  1206  
  1207  	var foundErr error
  1208  	for iter.Next() {
  1209  		v := iter.Value()
  1210  		if elemType.Kind() == reflect.Ptr && v.Type() == ast.NullType {
  1211  			// set nil value to pointer
  1212  			sliceValue = reflect.Append(sliceValue, reflect.Zero(elemType))
  1213  			continue
  1214  		}
  1215  		dstValue, err := d.createDecodedNewValue(ctx, elemType, v, "")
  1216  		if err != nil {
  1217  			if foundErr == nil {
  1218  				foundErr = err
  1219  			}
  1220  			continue
  1221  		}
  1222  		sliceValue = reflect.Append(sliceValue, d.castToAssignableValue(dstValue, elemType))
  1223  	}
  1224  	dst.Set(sliceValue)
  1225  	if foundErr != nil {
  1226  		return errors.Wrapf(foundErr, "failed to decode value")
  1227  	}
  1228  	return nil
  1229  }
  1230  
  1231  func (d *Decoder) decodeMapItem(ctx context.Context, dst *MapItem, src ast.Node) error {
  1232  	mapNode, err := d.getMapNode(src)
  1233  	if err != nil {
  1234  		return errors.Wrapf(err, "failed to get map node")
  1235  	}
  1236  	if mapNode == nil {
  1237  		return nil
  1238  	}
  1239  	mapIter := mapNode.MapRange()
  1240  	if !mapIter.Next() {
  1241  		return nil
  1242  	}
  1243  	key := mapIter.Key()
  1244  	value := mapIter.Value()
  1245  	if key.Type() == ast.MergeKeyType {
  1246  		if err := d.decodeMapItem(ctx, dst, value); err != nil {
  1247  			return errors.Wrapf(err, "failed to decode map with merge key")
  1248  		}
  1249  		return nil
  1250  	}
  1251  	*dst = MapItem{
  1252  		Key:   d.nodeToValue(key),
  1253  		Value: d.nodeToValue(value),
  1254  	}
  1255  	return nil
  1256  }
  1257  
  1258  func (d *Decoder) validateDuplicateKey(keyMap map[string]struct{}, key interface{}, keyNode ast.Node) error {
  1259  	k, ok := key.(string)
  1260  	if !ok {
  1261  		return nil
  1262  	}
  1263  	if d.disallowDuplicateKey {
  1264  		if _, exists := keyMap[k]; exists {
  1265  			return errDuplicateKey(fmt.Sprintf(`duplicate key "%s"`, k), keyNode.GetToken())
  1266  		}
  1267  	}
  1268  	keyMap[k] = struct{}{}
  1269  	return nil
  1270  }
  1271  
  1272  func (d *Decoder) decodeMapSlice(ctx context.Context, dst *MapSlice, src ast.Node) error {
  1273  	mapNode, err := d.getMapNode(src)
  1274  	if err != nil {
  1275  		return errors.Wrapf(err, "failed to get map node")
  1276  	}
  1277  	if mapNode == nil {
  1278  		return nil
  1279  	}
  1280  	mapSlice := MapSlice{}
  1281  	mapIter := mapNode.MapRange()
  1282  	keyMap := map[string]struct{}{}
  1283  	for mapIter.Next() {
  1284  		key := mapIter.Key()
  1285  		value := mapIter.Value()
  1286  		if key.Type() == ast.MergeKeyType {
  1287  			var m MapSlice
  1288  			if err := d.decodeMapSlice(ctx, &m, value); err != nil {
  1289  				return errors.Wrapf(err, "failed to decode map with merge key")
  1290  			}
  1291  			for _, v := range m {
  1292  				if err := d.validateDuplicateKey(keyMap, v.Key, value); err != nil {
  1293  					return errors.Wrapf(err, "invalid map key")
  1294  				}
  1295  				mapSlice = append(mapSlice, v)
  1296  			}
  1297  			continue
  1298  		}
  1299  		k := d.nodeToValue(key)
  1300  		if err := d.validateDuplicateKey(keyMap, k, key); err != nil {
  1301  			return errors.Wrapf(err, "invalid map key")
  1302  		}
  1303  		mapSlice = append(mapSlice, MapItem{
  1304  			Key:   k,
  1305  			Value: d.nodeToValue(value),
  1306  		})
  1307  	}
  1308  	*dst = mapSlice
  1309  	return nil
  1310  }
  1311  
  1312  func (d *Decoder) decodeMap(ctx context.Context, dst reflect.Value, src ast.Node) error {
  1313  	mapNode, err := d.getMapNode(src)
  1314  	if err != nil {
  1315  		return errors.Wrapf(err, "failed to get map node")
  1316  	}
  1317  	if mapNode == nil {
  1318  		return nil
  1319  	}
  1320  	mapType := dst.Type()
  1321  	mapValue := reflect.MakeMap(mapType)
  1322  	keyType := mapValue.Type().Key()
  1323  	valueType := mapValue.Type().Elem()
  1324  	mapIter := mapNode.MapRange()
  1325  	keyMap := map[string]struct{}{}
  1326  	var foundErr error
  1327  	for mapIter.Next() {
  1328  		key := mapIter.Key()
  1329  		value := mapIter.Value()
  1330  		if key.Type() == ast.MergeKeyType {
  1331  			if err := d.decodeMap(ctx, dst, value); err != nil {
  1332  				return errors.Wrapf(err, "failed to decode map with merge key")
  1333  			}
  1334  			iter := dst.MapRange()
  1335  			for iter.Next() {
  1336  				if err := d.validateDuplicateKey(keyMap, iter.Key(), value); err != nil {
  1337  					return errors.Wrapf(err, "invalid map key")
  1338  				}
  1339  				mapValue.SetMapIndex(iter.Key(), iter.Value())
  1340  			}
  1341  			continue
  1342  		}
  1343  		k := reflect.ValueOf(d.nodeToValue(key))
  1344  		if k.IsValid() && k.Type().ConvertibleTo(keyType) {
  1345  			k = k.Convert(keyType)
  1346  		}
  1347  		if k.IsValid() {
  1348  			if err := d.validateDuplicateKey(keyMap, k.Interface(), key); err != nil {
  1349  				return errors.Wrapf(err, "invalid map key")
  1350  			}
  1351  		}
  1352  		if valueType.Kind() == reflect.Ptr && value.Type() == ast.NullType {
  1353  			// set nil value to pointer
  1354  			mapValue.SetMapIndex(k, reflect.Zero(valueType))
  1355  			continue
  1356  		}
  1357  		dstValue, err := d.createDecodedNewValue(ctx, valueType, value, "")
  1358  		if err != nil {
  1359  			if foundErr == nil {
  1360  				foundErr = err
  1361  			}
  1362  		}
  1363  		if !k.IsValid() {
  1364  			// expect nil key
  1365  			mapValue.SetMapIndex(d.createDecodableValue(keyType), d.castToAssignableValue(dstValue, valueType))
  1366  			continue
  1367  		}
  1368  		mapValue.SetMapIndex(k, d.castToAssignableValue(dstValue, valueType))
  1369  	}
  1370  	dst.Set(mapValue)
  1371  	if foundErr != nil {
  1372  		return errors.Wrapf(foundErr, "failed to decode value")
  1373  	}
  1374  	return nil
  1375  }
  1376  
  1377  func (d *Decoder) fileToReader(file string) (io.Reader, error) {
  1378  	reader, err := os.Open(file)
  1379  	if err != nil {
  1380  		return nil, errors.Wrapf(err, "failed to open file")
  1381  	}
  1382  	return reader, nil
  1383  }
  1384  
  1385  func (d *Decoder) isYAMLFile(file string) bool {
  1386  	ext := filepath.Ext(file)
  1387  	if ext == ".yml" {
  1388  		return true
  1389  	}
  1390  	if ext == ".yaml" {
  1391  		return true
  1392  	}
  1393  	return false
  1394  }
  1395  
  1396  func (d *Decoder) readersUnderDir(dir string) ([]io.Reader, error) {
  1397  	pattern := fmt.Sprintf("%s/*", dir)
  1398  	matches, err := filepath.Glob(pattern)
  1399  	if err != nil {
  1400  		return nil, errors.Wrapf(err, "failed to get files by %s", pattern)
  1401  	}
  1402  	readers := []io.Reader{}
  1403  	for _, match := range matches {
  1404  		if !d.isYAMLFile(match) {
  1405  			continue
  1406  		}
  1407  		reader, err := d.fileToReader(match)
  1408  		if err != nil {
  1409  			return nil, errors.Wrapf(err, "failed to get reader")
  1410  		}
  1411  		readers = append(readers, reader)
  1412  	}
  1413  	return readers, nil
  1414  }
  1415  
  1416  func (d *Decoder) readersUnderDirRecursive(dir string) ([]io.Reader, error) {
  1417  	readers := []io.Reader{}
  1418  	if err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  1419  		if !d.isYAMLFile(path) {
  1420  			return nil
  1421  		}
  1422  		reader, err := d.fileToReader(path)
  1423  		if err != nil {
  1424  			return errors.Wrapf(err, "failed to get reader")
  1425  		}
  1426  		readers = append(readers, reader)
  1427  		return nil
  1428  	}); err != nil {
  1429  		return nil, errors.Wrapf(err, "interrupt walk in %s", dir)
  1430  	}
  1431  	return readers, nil
  1432  }
  1433  
  1434  func (d *Decoder) resolveReference() error {
  1435  	for _, opt := range d.opts {
  1436  		if err := opt(d); err != nil {
  1437  			return errors.Wrapf(err, "failed to exec option")
  1438  		}
  1439  	}
  1440  	for _, file := range d.referenceFiles {
  1441  		reader, err := d.fileToReader(file)
  1442  		if err != nil {
  1443  			return errors.Wrapf(err, "failed to get reader")
  1444  		}
  1445  		d.referenceReaders = append(d.referenceReaders, reader)
  1446  	}
  1447  	for _, dir := range d.referenceDirs {
  1448  		if !d.isRecursiveDir {
  1449  			readers, err := d.readersUnderDir(dir)
  1450  			if err != nil {
  1451  				return errors.Wrapf(err, "failed to get readers from under the %s", dir)
  1452  			}
  1453  			d.referenceReaders = append(d.referenceReaders, readers...)
  1454  		} else {
  1455  			readers, err := d.readersUnderDirRecursive(dir)
  1456  			if err != nil {
  1457  				return errors.Wrapf(err, "failed to get readers from under the %s", dir)
  1458  			}
  1459  			d.referenceReaders = append(d.referenceReaders, readers...)
  1460  		}
  1461  	}
  1462  	for _, reader := range d.referenceReaders {
  1463  		bytes, err := ioutil.ReadAll(reader)
  1464  		if err != nil {
  1465  			return errors.Wrapf(err, "failed to read buffer")
  1466  		}
  1467  
  1468  		// assign new anchor definition to anchorMap
  1469  		if _, err := d.parse(bytes); err != nil {
  1470  			return errors.Wrapf(err, "failed to decode")
  1471  		}
  1472  	}
  1473  	d.isResolvedReference = true
  1474  	return nil
  1475  }
  1476  
  1477  func (d *Decoder) parse(bytes []byte) (*ast.File, error) {
  1478  	f, err := parser.ParseBytes(bytes, 0)
  1479  	if err != nil {
  1480  		return nil, errors.Wrapf(err, "failed to parse yaml")
  1481  	}
  1482  	normalizedFile := &ast.File{}
  1483  	for _, doc := range f.Docs {
  1484  		// try to decode ast.Node to value and map anchor value to anchorMap
  1485  		if v := d.nodeToValue(doc.Body); v != nil {
  1486  			normalizedFile.Docs = append(normalizedFile.Docs, doc)
  1487  		}
  1488  	}
  1489  	return normalizedFile, nil
  1490  }
  1491  
  1492  func (d *Decoder) isInitialized() bool {
  1493  	return d.parsedFile != nil
  1494  }
  1495  
  1496  func (d *Decoder) decodeInit() error {
  1497  	if !d.isResolvedReference {
  1498  		if err := d.resolveReference(); err != nil {
  1499  			return errors.Wrapf(err, "failed to resolve reference")
  1500  		}
  1501  	}
  1502  	var buf bytes.Buffer
  1503  	if _, err := io.Copy(&buf, d.reader); err != nil {
  1504  		return errors.Wrapf(err, "failed to copy from reader")
  1505  	}
  1506  	file, err := d.parse(buf.Bytes())
  1507  	if err != nil {
  1508  		return errors.Wrapf(err, "failed to decode")
  1509  	}
  1510  	d.parsedFile = file
  1511  	return nil
  1512  }
  1513  
  1514  func (d *Decoder) decode(ctx context.Context, v reflect.Value) error {
  1515  	if len(d.parsedFile.Docs) <= d.streamIndex {
  1516  		return io.EOF
  1517  	}
  1518  	body := d.parsedFile.Docs[d.streamIndex].Body
  1519  	if body == nil {
  1520  		return nil
  1521  	}
  1522  	if err := d.decodeValue(ctx, v.Elem(), body); err != nil {
  1523  		return errors.Wrapf(err, "failed to decode value")
  1524  	}
  1525  	d.streamIndex++
  1526  	return nil
  1527  }
  1528  
  1529  // Decode reads the next YAML-encoded value from its input
  1530  // and stores it in the value pointed to by v.
  1531  //
  1532  // See the documentation for Unmarshal for details about the
  1533  // conversion of YAML into a Go value.
  1534  func (d *Decoder) Decode(v interface{}) error {
  1535  	return d.DecodeContext(context.Background(), v)
  1536  }
  1537  
  1538  // DecodeContext reads the next YAML-encoded value from its input
  1539  // and stores it in the value pointed to by v with context.Context.
  1540  func (d *Decoder) DecodeContext(ctx context.Context, v interface{}) error {
  1541  	rv := reflect.ValueOf(v)
  1542  	if rv.Type().Kind() != reflect.Ptr {
  1543  		return errors.ErrDecodeRequiredPointerType
  1544  	}
  1545  	if d.isInitialized() {
  1546  		if err := d.decode(ctx, rv); err != nil {
  1547  			if err == io.EOF {
  1548  				return err
  1549  			}
  1550  			return errors.Wrapf(err, "failed to decode")
  1551  		}
  1552  		return nil
  1553  	}
  1554  	if err := d.decodeInit(); err != nil {
  1555  		return errors.Wrapf(err, "failed to decodInit")
  1556  	}
  1557  	if err := d.decode(ctx, rv); err != nil {
  1558  		if err == io.EOF {
  1559  			return err
  1560  		}
  1561  		return errors.Wrapf(err, "failed to decode")
  1562  	}
  1563  	return nil
  1564  }
  1565  
  1566  // DecodeFromNode decodes node into the value pointed to by v.
  1567  func (d *Decoder) DecodeFromNode(node ast.Node, v interface{}) error {
  1568  	return d.DecodeFromNodeContext(context.Background(), node, v)
  1569  }
  1570  
  1571  // DecodeFromNodeContext decodes node into the value pointed to by v with context.Context.
  1572  func (d *Decoder) DecodeFromNodeContext(ctx context.Context, node ast.Node, v interface{}) error {
  1573  	rv := reflect.ValueOf(v)
  1574  	if rv.Type().Kind() != reflect.Ptr {
  1575  		return errors.ErrDecodeRequiredPointerType
  1576  	}
  1577  	if !d.isInitialized() {
  1578  		if err := d.decodeInit(); err != nil {
  1579  			return errors.Wrapf(err, "failed to decodInit")
  1580  		}
  1581  	}
  1582  	// resolve references to the anchor on the same file
  1583  	d.nodeToValue(node)
  1584  	if err := d.decodeValue(ctx, rv.Elem(), node); err != nil {
  1585  		return errors.Wrapf(err, "failed to decode value")
  1586  	}
  1587  	return nil
  1588  }