(n *Node, out reflect.Value)
| 876 | } |
| 877 | |
| 878 | func (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) |
no test coverage detected