isNilDriverValuer returns true if value is any type of nil unless it implements driver.Valuer. *T is not considered to implement driver.Valuer if it is only implemented by T.
(value any)
| 2038 | // isNilDriverValuer returns true if value is any type of nil unless it implements driver.Valuer. *T is not considered to implement |
| 2039 | // driver.Valuer if it is only implemented by T. |
| 2040 | func isNilDriverValuer(value any) (isNil, callNilDriverValuer bool) { |
| 2041 | if value == nil { |
| 2042 | return true, false |
| 2043 | } |
| 2044 | |
| 2045 | refVal := reflect.ValueOf(value) |
| 2046 | kind := refVal.Kind() |
| 2047 | switch kind { |
| 2048 | case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.UnsafePointer, reflect.Interface, reflect.Slice: |
| 2049 | if !refVal.IsNil() { |
| 2050 | return false, false |
| 2051 | } |
| 2052 | |
| 2053 | if _, ok := value.(driver.Valuer); ok { |
| 2054 | if kind == reflect.Pointer { |
| 2055 | // The type assertion will succeed if driver.Valuer is implemented on T or *T. Check if it is implemented on *T |
| 2056 | // by checking if it is not implemented on *T. |
| 2057 | return true, !refVal.Type().Elem().Implements(valuerReflectType) |
| 2058 | } else { |
| 2059 | return true, true |
| 2060 | } |
| 2061 | } |
| 2062 | |
| 2063 | return true, false |
| 2064 | default: |
| 2065 | return false, false |
| 2066 | } |
| 2067 | } |
no outgoing calls
no test coverage detected