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 }