<?php

namespace GuzzleHttp\Promise;

use JsonSerializable;
use RuntimeException;

/**
 * A special exception that is thrown when waiting on a rejected promise.
 *
 * The reason value is available via the getReason() method.
 */
class RejectionException extends RuntimeException {
	/** @var mixed Rejection reason. */
	private $reason;

	/**
	 * @param mixed $reason Rejection reason.
	 * @param string $description Optional description
	 */
	public function __construct( $reason, $description = null ) {
		$this->reason = $reason;

		$message = 'The promise was rejected';

		if ( $description ) {
			$message .= ' with reason: ' . $description;
		} elseif ( is_string( $reason )
		           || ( is_object( $reason ) && method_exists( $reason, '__toString' ) )
		) {
			$message .= ' with reason: ' . $this->reason;
		} elseif ( $reason instanceof JsonSerializable ) {
			$message .= ' with reason: '
			            . json_encode( $this->reason, JSON_PRETTY_PRINT );
		}

		parent::__construct( $message );
	}

	/**
	 * Returns the rejection reason.
	 *
	 * @return mixed
	 */
	public function getReason() {
		return $this->reason;
	}
}
