storj.io/uplink@v1.13.0/private/metaclient/batch.go (about)

     1  // Copyright (C) 2019 Storj Labs, Inc.
     2  // See LICENSE for copying information.
     3  
     4  package metaclient
     5  
     6  import (
     7  	"context"
     8  
     9  	"github.com/zeebo/errs"
    10  
    11  	"storj.io/common/pb"
    12  )
    13  
    14  var (
    15  	// ErrInvalidType error for inalid response type casting.
    16  	ErrInvalidType = errs.New("invalid response type")
    17  )
    18  
    19  // Batcher issues batches.
    20  type Batcher interface {
    21  	// Batch issues multiple requests in one batch.
    22  	Batch(ctx context.Context, items ...BatchItem) ([]BatchResponse, error)
    23  }
    24  
    25  // BatchItem represents single request in batch.
    26  type BatchItem interface {
    27  	BatchItem() *pb.BatchRequestItem
    28  }
    29  
    30  // BatchResponse single response from batch call.
    31  type BatchResponse struct {
    32  	pbRequest  interface{}
    33  	pbResponse interface{}
    34  }
    35  
    36  // MakeBatchResponse makes a batch response from the request and response
    37  // protobufs.
    38  func MakeBatchResponse(req *pb.BatchRequestItem, resp *pb.BatchResponseItem) BatchResponse {
    39  	return BatchResponse{
    40  		pbRequest:  req.Request,
    41  		pbResponse: resp.Response,
    42  	}
    43  }
    44  
    45  // CreateBucket returns BatchResponse for CreateBucket request.
    46  func (resp *BatchResponse) CreateBucket() (CreateBucketResponse, error) {
    47  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_BucketCreate)
    48  	if !ok {
    49  		return CreateBucketResponse{}, ErrInvalidType
    50  	}
    51  
    52  	createResponse, err := newCreateBucketResponse(item.BucketCreate)
    53  	if err != nil {
    54  		return CreateBucketResponse{}, err
    55  	}
    56  	return createResponse, nil
    57  }
    58  
    59  // GetBucket returns response for GetBucket request.
    60  func (resp *BatchResponse) GetBucket() (GetBucketResponse, error) {
    61  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_BucketGet)
    62  	if !ok {
    63  		return GetBucketResponse{}, ErrInvalidType
    64  	}
    65  	getResponse, err := newGetBucketResponse(item.BucketGet)
    66  	if err != nil {
    67  		return GetBucketResponse{}, err
    68  	}
    69  	return getResponse, nil
    70  }
    71  
    72  // ListBuckets returns response for ListBuckets request.
    73  func (resp *BatchResponse) ListBuckets() (ListBucketsResponse, error) {
    74  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_BucketList)
    75  	if !ok {
    76  		return ListBucketsResponse{}, ErrInvalidType
    77  	}
    78  	return newListBucketsResponse(item.BucketList), nil
    79  }
    80  
    81  // BeginObject returns response for BeginObject request.
    82  func (resp *BatchResponse) BeginObject() (BeginObjectResponse, error) {
    83  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_ObjectBegin)
    84  	if !ok {
    85  		return BeginObjectResponse{}, ErrInvalidType
    86  	}
    87  
    88  	return newBeginObjectResponse(item.ObjectBegin), nil
    89  }
    90  
    91  // IsCommitObject returns true if response is from CommitObject request.
    92  func (resp *BatchResponse) IsCommitObject() bool {
    93  	_, ok := resp.pbResponse.(*pb.BatchResponseItem_ObjectCommit)
    94  	return ok
    95  }
    96  
    97  // CommitObject returns response for CommitObject request.
    98  func (resp *BatchResponse) CommitObject() (CommitObjectResponse, error) {
    99  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_ObjectCommit)
   100  	if !ok {
   101  		return CommitObjectResponse{}, ErrInvalidType
   102  	}
   103  
   104  	return CommitObjectResponse{
   105  		Object: newObjectInfo(item.ObjectCommit.Object),
   106  	}, nil
   107  }
   108  
   109  // BeginDeleteObject returns response for BeginDeleteObject request.
   110  func (resp *BatchResponse) BeginDeleteObject() (BeginDeleteObjectResponse, error) {
   111  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_ObjectBeginDelete)
   112  	if !ok {
   113  		return BeginDeleteObjectResponse{}, ErrInvalidType
   114  	}
   115  	return newBeginDeleteObjectResponse(item.ObjectBeginDelete), nil
   116  }
   117  
   118  // GetObject returns response for GetObject request.
   119  func (resp *BatchResponse) GetObject() (GetObjectResponse, error) {
   120  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_ObjectGet)
   121  	if !ok {
   122  		return GetObjectResponse{}, ErrInvalidType
   123  	}
   124  	return newGetObjectResponse(item.ObjectGet), nil
   125  }
   126  
   127  // ListObjects returns response for ListObjects request.
   128  func (resp *BatchResponse) ListObjects() (ListObjectsResponse, error) {
   129  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_ObjectList)
   130  	if !ok {
   131  		return ListObjectsResponse{}, ErrInvalidType
   132  	}
   133  
   134  	requestItem, ok := resp.pbRequest.(*pb.BatchRequestItem_ObjectList)
   135  	if !ok {
   136  		return ListObjectsResponse{}, ErrInvalidType
   137  	}
   138  
   139  	return newListObjectsResponse(item.ObjectList, requestItem.ObjectList.EncryptedPrefix, requestItem.ObjectList.Recursive), nil
   140  }
   141  
   142  // BeginSegment returns response for BeginSegment request.
   143  func (resp *BatchResponse) BeginSegment() (BeginSegmentResponse, error) {
   144  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_SegmentBegin)
   145  	if !ok {
   146  		return BeginSegmentResponse{}, ErrInvalidType
   147  	}
   148  
   149  	return newBeginSegmentResponse(item.SegmentBegin)
   150  }
   151  
   152  // DownloadSegment returns response for DownloadSegment request.
   153  func (resp *BatchResponse) DownloadSegment() (DownloadSegmentResponse, error) {
   154  	item, ok := resp.pbResponse.(*pb.BatchResponseItem_SegmentDownload)
   155  	if !ok {
   156  		return DownloadSegmentResponse{}, ErrInvalidType
   157  	}
   158  	return newDownloadSegmentResponse(item.SegmentDownload), nil
   159  }