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 }