<?php

namespace Aws\S3;

use Aws\Api\Parser\AbstractParser;
use Aws\Api\Parser\Exception\ParserException;
use Aws\Api\StructureShape;
use Aws\CommandInterface;
use Aws\Exception\AwsException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;

/**
 * Converts malformed responses to a retryable error type.
 *
 * @internal
 */
class RetryableMalformedResponseParser extends AbstractParser {
	/** @var string */
	private $exceptionClass;

	public function __construct(
		callable $parser,
		$exceptionClass = AwsException::class
	) {
		$this->parser         = $parser;
		$this->exceptionClass = $exceptionClass;
	}

	public function __invoke(
		CommandInterface $command,
		ResponseInterface $response
	) {
		$fn = $this->parser;

		try {
			return $fn( $command, $response );
		} catch ( ParserException $e ) {
			throw new $this->exceptionClass(
				"Error parsing response for {$command->getName()}:"
				. " AWS parsing error: {$e->getMessage()}",
				$command,
				[ 'connection_error' => true, 'exception' => $e ],
				$e
			);
		}
	}

	public function parseMemberFromStream(
		StreamInterface $stream,
		StructureShape $member,
		$response
	) {
		return $this->parser->parseMemberFromStream( $stream, $member, $response );
	}
}
