diff --git a/shared/client/response.go b/shared/client/response.go index fc34485..c8ce025 100644 --- a/shared/client/response.go +++ b/shared/client/response.go @@ -2,6 +2,7 @@ package client import ( "encoding/json" + "fmt" "reflect" "time" @@ -77,15 +78,23 @@ func (r *Response) UnmarshalJSONObject(dec *gojay.Decoder, key string) error { return nil } -func (r *Response) DataItemType() reflect.Type { +func (r *Response) DataItemType() (reflect.Type, error) { if r.Data == nil { - return reflect.TypeOf(&struct{}{}) + return reflect.TypeOf(&struct{}{}), nil } - dataType := reflect.TypeOf(r.Data).Elem() - if dataType.Kind() == reflect.Slice { - return dataType.Elem() + + dataType := reflect.TypeOf(r.Data) + // in go1.18 this was renamed to Pointer + if dataType.Kind() != reflect.Ptr && dataType.Kind() != reflect.Interface { + return nil, fmt.Errorf("expected Ptr or Interface, got %v", dataType) + } + + elemType := dataType.Elem() + if elemType.Kind() == reflect.Slice { + return elemType.Elem(), nil } - return dataType + + return elemType, nil } //NKeys returns object keys JSON (gojay API) diff --git a/shared/client/service.go b/shared/client/service.go index a922c54..775b66a 100644 --- a/shared/client/service.go +++ b/shared/client/service.go @@ -156,7 +156,11 @@ func (s *Service) Run(ctx context.Context, input interface{}, response *Response func (s *Service) loadFromCache(ctx context.Context, cached *[]interface{}, batchSize int, response *Response, cachable Cachable) (int, error) { *cached = make([]interface{}, batchSize) - dataType := response.DataItemType() + dataType, err := response.DataItemType() + if err != nil { + return 0, err + } + if batchSize > 0 { cachedCount, err := s.readFromCacheInBatch(ctx, batchSize, dataType, cachable, response, *cached) if err != nil && !common.IsTransientError(err) {