func decodeBatchWriteItemOutput()

in dax/internal/client/response.go [489:597]


func decodeBatchWriteItemOutput(ctx context.Context, reader *cbor.Reader, keySchemaCache *lru.Lru, attrNamesListToId *lru.Lru, output *dynamodb.BatchWriteItemOutput) (*dynamodb.BatchWriteItemOutput, error) {
	if output != nil {
		output.UnprocessedItems = map[string][]types.WriteRequest{}
	}
	if consumed, err := consumeNil(reader); err != nil {
		return output, err
	} else if consumed {
		return output, nil
	}
	numTables, err := reader.ReadMapLength()
	if err != nil {
		return output, err
	}
	if output == nil {
		output = &dynamodb.BatchWriteItemOutput{UnprocessedItems: map[string][]types.WriteRequest{}}
	}
	if numTables > 0 {
		unprocessed := make(map[string][]types.WriteRequest, numTables)
		for i := 0; i < numTables; i++ {
			table, err := reader.ReadString()
			if err != nil {
				return output, err
			}
			tableKeys, err := getKeySchema(ctx, keySchemaCache, table)
			if err != nil {
				return output, err
			}
			numObjs, err := reader.ReadArrayLength()
			if err != nil {
				return output, err
			}
			numItems := numObjs / 2
			wrs := make([]types.WriteRequest, numItems)
			for j := 0; j < numItems; j++ {
				keys, err := decodeKey(reader, tableKeys)
				if err != nil {
					return output, err
				}
				item, err := decodeNonKeyAttributes(ctx, reader, attrNamesListToId, nil)
				if err != nil {
					return output, err
				}
				wr := types.WriteRequest{}
				if item == nil {
					wr.DeleteRequest = &types.DeleteRequest{Key: keys}
				} else {
					for k, v := range keys {
						item[k] = v
					}
					wr.PutRequest = &types.PutRequest{Item: item}
				}
				wrs[j] = wr
			}
			unprocessed[table] = wrs
		}
		if len(unprocessed) != 0 {
			output.UnprocessedItems = unprocessed
		}
	}

	numCC, err := reader.ReadArrayLength()
	if err != nil {
		return output, err
	}
	if numCC > 0 {
		output.ConsumedCapacity = make([]types.ConsumedCapacity, numCC)
		for i := 0; i < numCC; i++ {
			capacity, err := decodeConsumedCapacity(reader)
			if err != nil {
				return output, err
			}
			output.ConsumedCapacity[i] = *capacity
		}
	}

	icmLen, err := reader.ReadMapLength()
	if err != nil {
		return output, err
	}
	if icmLen > 0 {
		output.ItemCollectionMetrics = make(map[string][]types.ItemCollectionMetrics, icmLen)
		for i := 0; i < icmLen; i++ {
			table, err := reader.ReadString()
			if err != nil {
				return output, err
			}
			keys, err := getKeySchema(ctx, keySchemaCache, table)
			if err != nil {
				return output, err
			}
			pkey := *keys[0].AttributeName
			numMetrics, err := reader.ReadArrayLength()
			if err != nil {
				return output, err
			}
			metrics := make([]types.ItemCollectionMetrics, numMetrics)
			for j := 0; j < numMetrics; j++ {
				itemCollectionMetric, err := decodeItemCollectionMetrics(reader, pkey)
				if err != nil {
					return output, err
				}
				metrics[j] = *itemCollectionMetric
			}
			output.ItemCollectionMetrics[table] = metrics
		}
	}

	return output, nil
}