1<?php 2 3declare(strict_types=1); 4 5namespace GuzzleHttp\Promise; 6 7/** 8 * A promise that has been fulfilled. 9 * 10 * Thenning off of this promise will invoke the onFulfilled callback 11 * immediately and ignore other callbacks. 12 * 13 * @final 14 */ 15class FulfilledPromise implements PromiseInterface 16{ 17 private $value; 18 19 /** 20 * @param mixed $value 21 */ 22 public function __construct($value) 23 { 24 if (is_object($value) && method_exists($value, 'then')) { 25 throw new \InvalidArgumentException( 26 'You cannot create a FulfilledPromise with a promise.' 27 ); 28 } 29 30 $this->value = $value; 31 } 32 33 public function then( 34 callable $onFulfilled = null, 35 callable $onRejected = null 36 ): PromiseInterface { 37 // Return itself if there is no onFulfilled function. 38 if (!$onFulfilled) { 39 return $this; 40 } 41 42 $queue = Utils::queue(); 43 $p = new Promise([$queue, 'run']); 44 $value = $this->value; 45 $queue->add(static function () use ($p, $value, $onFulfilled): void { 46 if (Is::pending($p)) { 47 try { 48 $p->resolve($onFulfilled($value)); 49 } catch (\Throwable $e) { 50 $p->reject($e); 51 } 52 } 53 }); 54 55 return $p; 56 } 57 58 public function otherwise(callable $onRejected): PromiseInterface 59 { 60 return $this->then(null, $onRejected); 61 } 62 63 public function wait(bool $unwrap = true) 64 { 65 return $unwrap ? $this->value : null; 66 } 67 68 public function getState(): string 69 { 70 return self::FULFILLED; 71 } 72 73 public function resolve($value): void 74 { 75 if ($value !== $this->value) { 76 throw new \LogicException('Cannot resolve a fulfilled promise'); 77 } 78 } 79 80 public function reject($reason): void 81 { 82 throw new \LogicException('Cannot reject a fulfilled promise'); 83 } 84 85 public function cancel(): void 86 { 87 // pass 88 } 89} 90