MCPcopy
hub / github.com/go-yaml/yaml / mappingStruct

Method mappingStruct

decode.go:878–953  ·  view source on GitHub ↗
(n *Node, out reflect.Value)

Source from the content-addressed store, hash-verified

876}
877
878func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) {
879 sinfo, err := getStructInfo(out.Type())
880 if err != nil {
881 panic(err)
882 }
883
884 var inlineMap reflect.Value
885 var elemType reflect.Type
886 if sinfo.InlineMap != -1 {
887 inlineMap = out.Field(sinfo.InlineMap)
888 elemType = inlineMap.Type().Elem()
889 }
890
891 for _, index := range sinfo.InlineUnmarshalers {
892 field := d.fieldByIndex(n, out, index)
893 d.prepare(n, field)
894 }
895
896 mergedFields := d.mergedFields
897 d.mergedFields = nil
898 var mergeNode *Node
899 var doneFields []bool
900 if d.uniqueKeys {
901 doneFields = make([]bool, len(sinfo.FieldsList))
902 }
903 name := settableValueOf("")
904 l := len(n.Content)
905 for i := 0; i < l; i += 2 {
906 ni := n.Content[i]
907 if isMerge(ni) {
908 mergeNode = n.Content[i+1]
909 continue
910 }
911 if !d.unmarshal(ni, name) {
912 continue
913 }
914 sname := name.String()
915 if mergedFields != nil {
916 if mergedFields[sname] {
917 continue
918 }
919 mergedFields[sname] = true
920 }
921 if info, ok := sinfo.FieldsMap[sname]; ok {
922 if d.uniqueKeys {
923 if doneFields[info.Id] {
924 d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type()))
925 continue
926 }
927 doneFields[info.Id] = true
928 }
929 var field reflect.Value
930 if info.Inline == nil {
931 field = out.Field(info.Num)
932 } else {
933 field = d.fieldByIndex(n, out, info.Inline)
934 }
935 d.unmarshal(n.Content[i+1], field)

Callers 1

mappingMethod · 0.95

Calls 8

fieldByIndexMethod · 0.95
prepareMethod · 0.95
unmarshalMethod · 0.95
mergeMethod · 0.95
getStructInfoFunction · 0.85
settableValueOfFunction · 0.85
isMergeFunction · 0.85
StringMethod · 0.45

Tested by

no test coverage detected