func encodeBatchWriteItemInput()

in dax/internal/client/request.go [430:506]


func encodeBatchWriteItemInput(ctx context.Context, input *dynamodb.BatchWriteItemInput, keySchema *lru.Lru, attrNamesListToId *lru.Lru, writer *cbor.Writer) error {
	if input == nil {
		return smithy.NewErrParamRequired("input cannot be nil")
	}
	var err error
	if err = ValidateOpBatchWriteItemInput(input); err != nil {
		return err
	}
	if err = encodeServiceAndMethod(batchWriteItem_116217951_1_Id, writer); err != nil {
		return err
	}
	if err = writer.WriteMapHeader(len(input.RequestItems)); err != nil {
		return err
	}
	totalRequests := 0
	for table, wrs := range input.RequestItems {
		keys, err := getKeySchema(ctx, keySchema, table)
		if err != nil {
			return err
		}

		l := len(wrs)
		if l == 0 {
			return &smithy.GenericAPIError{
				Code: ErrCodeInvalidParameter,
				Message: fmt.Sprintf("1 validation error detected: Value '{%s=%d}' at 'requestItems' failed to satisfy constraint:"+
					" Map value must satisfy constraint: [Member must have length less than or equal to 25, Member must have length greater than or equal to 1", table, l),
				Fault: smithy.FaultClient,
			}
		}
		totalRequests = totalRequests + l
		if totalRequests > maxWriteBatchSize {
			return &smithy.GenericAPIError{
				Code: ErrCodeInvalidParameter,
				Message: fmt.Sprintf("1 validation error detected: Value '{%s=%d}' at 'requestItems' failed to satisfy constraint:"+
					" Map value must satisfy constraint: [Member must have length less than or equal to 25, Member must have length greater than or equal to 1", table, totalRequests),
				Fault: smithy.FaultClient,
			}
		}

		if err = writer.WriteString(table); err != nil {
			return err
		}
		if err = writer.WriteArrayHeader(2 * l); err != nil {
			return err
		}

		if hasDuplicatesWriteRequests(wrs, keys) {
			return errors.New("Provided list of item keys contains duplicates")
		}
		for _, wr := range wrs {
			if pr := wr.PutRequest; pr != nil {
				attrs := pr.Item
				if err = cbor.EncodeItemKey(attrs, keys, writer); err != nil {
					return err
				}
				if err = encodeNonKeyAttributes(ctx, attrs, keys, attrNamesListToId, writer); err != nil {
					return err
				}
			} else if dr := wr.DeleteRequest; dr != nil {
				if err = cbor.EncodeItemKey(dr.Key, keys, writer); err != nil {
					return err
				}
				if err = writer.WriteNull(); err != nil {
					return err
				}
			} else {
				return errors.New("Both PutRequest and DeleteRequest cannot be empty")
			}
		}
	}
	return encodeItemOperationOptionalParams(
		types.ReturnValueNone,
		input.ReturnConsumedCapacity,
		input.ReturnItemCollectionMetrics,
		nil, nil, nil, nil, nil, nil, writer)
}