(dict map[string]any, p tree.Path, extensions map[string]any)
| 763 | } |
| 764 | |
| 765 | func processExtensions(dict map[string]any, p tree.Path, extensions map[string]any) (map[string]interface{}, error) { |
| 766 | extras := map[string]any{} |
| 767 | var err error |
| 768 | for key, value := range dict { |
| 769 | skip := false |
| 770 | for _, uk := range userDefinedKeys { |
| 771 | if p.Matches(uk) { |
| 772 | skip = true |
| 773 | break |
| 774 | } |
| 775 | } |
| 776 | if !skip && strings.HasPrefix(key, "x-") { |
| 777 | extras[key] = value |
| 778 | delete(dict, key) |
| 779 | continue |
| 780 | } |
| 781 | switch v := value.(type) { |
| 782 | case map[string]interface{}: |
| 783 | dict[key], err = processExtensions(v, p.Next(key), extensions) |
| 784 | if err != nil { |
| 785 | return nil, err |
| 786 | } |
| 787 | case []interface{}: |
| 788 | for i, e := range v { |
| 789 | if m, ok := e.(map[string]interface{}); ok { |
| 790 | v[i], err = processExtensions(m, p.Next(strconv.Itoa(i)), extensions) |
| 791 | if err != nil { |
| 792 | return nil, err |
| 793 | } |
| 794 | } |
| 795 | } |
| 796 | } |
| 797 | } |
| 798 | for name, val := range extras { |
| 799 | if typ, ok := extensions[name]; ok { |
| 800 | target := reflect.New(reflect.TypeOf(typ)).Elem().Interface() |
| 801 | err = Transform(val, &target) |
| 802 | if err != nil { |
| 803 | return nil, err |
| 804 | } |
| 805 | extras[name] = target |
| 806 | } |
| 807 | } |
| 808 | if len(extras) > 0 { |
| 809 | dict[consts.Extensions] = extras |
| 810 | } |
| 811 | return dict, nil |
| 812 | } |
| 813 | |
| 814 | // Transform converts the source into the target struct with compose types transformer |
| 815 | // and the specified transformers if any. |
no test coverage detected
searching dependent graphs…