(v reflect.Value)
| 115 | } |
| 116 | |
| 117 | func (c *cloner) cloneMap(v reflect.Value) reflect.Value { |
| 118 | if v.IsNil() { |
| 119 | return reflect.Zero(v.Type()) |
| 120 | } |
| 121 | |
| 122 | clonedMap := reflect.MakeMap(v.Type()) |
| 123 | |
| 124 | for _, key := range v.MapKeys() { |
| 125 | value := v.MapIndex(key) |
| 126 | clonedKey := c.clone(key) |
| 127 | clonedValue := c.clone(value) |
| 128 | |
| 129 | if !isNillable(clonedKey) || !clonedKey.IsNil() { |
| 130 | clonedKey = clonedKey.Convert(key.Type()) |
| 131 | } |
| 132 | |
| 133 | if (!isNillable(clonedValue) || !clonedValue.IsNil()) && clonedValue.IsValid() { |
| 134 | clonedValue = clonedValue.Convert(value.Type()) |
| 135 | } |
| 136 | |
| 137 | if !clonedValue.IsValid() { |
| 138 | clonedValue = reflect.Zero(clonedMap.Type().Elem()) |
| 139 | } |
| 140 | |
| 141 | clonedMap.SetMapIndex(clonedKey, clonedValue) |
| 142 | } |
| 143 | |
| 144 | return clonedMap |
| 145 | } |
| 146 | |
| 147 | func isNillable(v reflect.Value) bool { |
| 148 | switch v.Kind() { |
no test coverage detected