12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- <?php
- namespace Aws\Api\Parser;
- use Aws\Api\Operation;
- use Aws\Api\StructureShape;
- use Aws\Api\Service;
- use Aws\Result;
- use Aws\CommandInterface;
- use Psr\Http\Message\ResponseInterface;
- use Psr\Http\Message\StreamInterface;
- /**
- * @internal Implements JSON-RPC parsing (e.g., DynamoDB)
- */
- class JsonRpcParser extends AbstractParser
- {
- use PayloadParserTrait;
- /**
- * @param Service $api Service description
- * @param JsonParser $parser JSON body builder
- */
- public function __construct(Service $api, JsonParser $parser = null)
- {
- parent::__construct($api);
- $this->parser = $parser ?: new JsonParser();
- }
- public function __invoke(
- CommandInterface $command,
- ResponseInterface $response
- ) {
- $operation = $this->api->getOperation($command->getName());
- return $this->parseResponse($response, $operation);
- }
- /**
- * This method parses a response based on JSON RPC protocol.
- *
- * @param ResponseInterface $response the response to parse.
- * @param Operation $operation the operation which holds information for
- * parsing the response.
- *
- * @return Result
- */
- private function parseResponse(ResponseInterface $response, Operation $operation)
- {
- if (null === $operation['output']) {
- return new Result([]);
- }
- $outputShape = $operation->getOutput();
- foreach ($outputShape->getMembers() as $memberName => $memberProps) {
- if (!empty($memberProps['eventstream'])) {
- return new Result([
- $memberName => new EventParsingIterator(
- $response->getBody(),
- $outputShape->getMember($memberName),
- $this
- )
- ]);
- }
- }
- $result = $this->parseMemberFromStream(
- $response->getBody(),
- $operation->getOutput(),
- $response
- );
- return new Result(is_null($result) ? [] : $result);
- }
- public function parseMemberFromStream(
- StreamInterface $stream,
- StructureShape $member,
- $response
- ) {
- return $this->parser->parse($member, $this->parseJson($stream, $response));
- }
- }
|