setValue attempts to set a reflect.Value with a given interface{} value
(field reflect.Value, value any)
| 133 | |
| 134 | // setValue attempts to set a reflect.Value with a given interface{} value |
| 135 | func setValue(field reflect.Value, value any) error { |
| 136 | if value == nil { |
| 137 | return nil |
| 138 | } |
| 139 | |
| 140 | valueRef := reflect.ValueOf(value) |
| 141 | |
| 142 | // Direct assignment if types are exactly equal |
| 143 | if valueRef.Type() == field.Type() { |
| 144 | field.Set(valueRef) |
| 145 | return nil |
| 146 | } |
| 147 | |
| 148 | // Check if types are assignable |
| 149 | if valueRef.Type().AssignableTo(field.Type()) { |
| 150 | field.Set(valueRef) |
| 151 | return nil |
| 152 | } |
| 153 | |
| 154 | // If field is pointer and value isn't already a pointer, try address |
| 155 | if field.Kind() == reflect.Ptr && valueRef.Kind() != reflect.Ptr { |
| 156 | return setValue(field, valueRef.Addr().Interface()) |
| 157 | } |
| 158 | |
| 159 | // Try conversion if types are convertible |
| 160 | if valueRef.Type().ConvertibleTo(field.Type()) { |
| 161 | field.Set(valueRef.Convert(field.Type())) |
| 162 | return nil |
| 163 | } |
| 164 | |
| 165 | return fmt.Errorf("cannot set value of type %v to field of type %v", valueRef.Type(), field.Type()) |
| 166 | } |
| 167 | |
| 168 | // DecodeDataURL decodes a data URL and returns the mimetype and raw data bytes |
| 169 | func DecodeDataURL(dataURL string) (mimeType string, data []byte, err error) { |
no test coverage detected