| 1812 | } |
| 1813 | |
| 1814 | func appendAssign(slice reflect.Value, val any) error { |
| 1815 | if slice.Kind() != reflect.Slice { |
| 1816 | return fmt.Errorf("appendAssign: expected slice, got %v", slice.Kind()) |
| 1817 | } |
| 1818 | if reflect.TypeOf(val).AssignableTo(slice.Type().Elem()) { |
| 1819 | slice.Set(reflect.Append(slice, reflect.ValueOf(val))) |
| 1820 | return nil |
| 1821 | } else if setter, ok := val.(Setter); ok { |
| 1822 | dst := reflect.New(slice.Type().Elem()).Elem() |
| 1823 | if err := setter.SetField(dst); err != nil { |
| 1824 | return fmt.Errorf("appendAssign: Setter.SetField: %w", err) |
| 1825 | } |
| 1826 | slice.Set(reflect.Append(slice, dst)) |
| 1827 | return nil |
| 1828 | } else { |
| 1829 | return fmt.Errorf("appendAssign: cannot assign %T to %s", val, slice.Type()) |
| 1830 | } |
| 1831 | } |