diff --git a/src/Read/ChainSegmentFactory.php b/src/Read/ChainSegmentFactory.php index 6246222..071c9bf 100644 --- a/src/Read/ChainSegmentFactory.php +++ b/src/Read/ChainSegmentFactory.php @@ -16,12 +16,6 @@ public function __construct(SegmentFactory ...$segmentFactories) $this->segmentFactories = $segmentFactories; } - /** - * @param string $segmentId - * @param string $segmentType - * @param array $criteria - * @return Segment - */ public function create(string $segmentId, string $segmentType, array $criteria): Segment { foreach ($this->segmentFactories as $segmentFactory) { diff --git a/src/Read/ChainToggleStrategyFactory.php b/src/Read/ChainToggleStrategyFactory.php index 07d4ef4..139ca43 100644 --- a/src/Read/ChainToggleStrategyFactory.php +++ b/src/Read/ChainToggleStrategyFactory.php @@ -10,6 +10,9 @@ use function array_merge; use function in_array; +/** + * @psalm-import-type WriteStrategy from \Pheature\Core\Toggle\Write\Strategy + */ final class ChainToggleStrategyFactory implements ToggleStrategyFactory { private SegmentFactory $segmentFactory; @@ -23,25 +26,19 @@ public function __construct(SegmentFactory $segmentFactory, ToggleStrategyFactor } /** - * @param array $strategy + * @param WriteStrategy $strategy * @return ToggleStrategy */ public function createFromArray(array $strategy): ToggleStrategy { - /** @var array>> $segments */ $segments = $strategy['segments']; - /** @var string $strategyId */ $strategyId = $strategy['strategy_id']; - /** @var string $strategyType */ $strategyType = $strategy['strategy_type']; return $this->create($strategyId, $strategyType, new Segments(...array_map( function (array $segment) { - /** @var string $segmentId */ $segmentId = $segment['segment_id']; - /** @var string $segmentType */ $segmentType = $segment['segment_type']; - /** @var array $criteria */ $criteria = $segment['criteria']; return $this->segmentFactory->create($segmentId, $segmentType, $criteria); diff --git a/src/Read/Feature.php b/src/Read/Feature.php index efb870b..06ab97c 100644 --- a/src/Read/Feature.php +++ b/src/Read/Feature.php @@ -6,9 +6,17 @@ use JsonSerializable; +/** + * @psalm-import-type ReadStrategies from ToggleStrategies + * @psalm-type ReadFeature array{id: string, is_enabled: bool, strategies: array} + */ interface Feature extends JsonSerializable { public function id(): string; public function strategies(): ToggleStrategies; public function isEnabled(): bool; + /** + * @return ReadFeature + */ + public function jsonSerialize(): array; } diff --git a/src/Read/Segment.php b/src/Read/Segment.php index 1fe6fbc..5eedfce 100644 --- a/src/Read/Segment.php +++ b/src/Read/Segment.php @@ -6,21 +6,29 @@ use JsonSerializable; +/** + * @psalm-type SegmentPayload array + * @psalm-type ReadSegment array{id: string, type: string, criteria: SegmentPayload} + */ interface Segment extends JsonSerializable { public function id(): string; public function type(): string; /** - * @return array + * @return SegmentPayload */ public function criteria(): array; /** - * @param array $payload + * @param SegmentPayload $payload * @return bool */ public function match(array $payload): bool; /** - * @return array> + * @return ReadSegment */ public function toArray(): array; + /** + * @return ReadSegment + */ + public function jsonSerialize(): array; } diff --git a/src/Read/SegmentFactory.php b/src/Read/SegmentFactory.php index 97ab701..ba5d81b 100644 --- a/src/Read/SegmentFactory.php +++ b/src/Read/SegmentFactory.php @@ -4,12 +4,15 @@ namespace Pheature\Core\Toggle\Read; +/** + * @psalm-import-type SegmentPayload from Segment + */ interface SegmentFactory extends WithProcessableFixedTypes { /** * @param string $segmentId * @param string $segmentType - * @param array $criteria + * @param SegmentPayload $criteria * @return Segment */ public function create(string $segmentId, string $segmentType, array $criteria): Segment; diff --git a/src/Read/ToggleStrategies.php b/src/Read/ToggleStrategies.php index 98594a9..4475d32 100644 --- a/src/Read/ToggleStrategies.php +++ b/src/Read/ToggleStrategies.php @@ -11,6 +11,8 @@ use function count; /** + * @psalm-import-type ReadStrategy from ToggleStrategy + * @psalm-type ReadStrategies array * @implements IteratorAggregate */ final class ToggleStrategies implements IteratorAggregate, JsonSerializable @@ -39,7 +41,7 @@ public function getIterator(): Generator } /** - * @return array> + * @return ReadStrategies */ public function jsonSerialize(): array { diff --git a/src/Read/ToggleStrategy.php b/src/Read/ToggleStrategy.php index e181bb0..43ba0af 100644 --- a/src/Read/ToggleStrategy.php +++ b/src/Read/ToggleStrategy.php @@ -6,13 +6,21 @@ use JsonSerializable; +/** + * @psalm-import-type ReadSegment from Segment + * @psalm-type ReadStrategy array{id: string, segments: array, type: string} + */ interface ToggleStrategy extends JsonSerializable { public function id(): string; public function type(): string; public function isSatisfiedBy(ConsumerIdentity $identity): bool; /** - * @return array + * @return ReadStrategy */ public function toArray(): array; + /** + * @return ReadStrategy + */ + public function jsonSerialize(): array; } diff --git a/src/Write/Feature.php b/src/Write/Feature.php index 716ae1e..19a8993 100644 --- a/src/Write/Feature.php +++ b/src/Write/Feature.php @@ -4,10 +4,10 @@ namespace Pheature\Core\Toggle\Write; +use JsonSerializable; use Pheature\Core\Toggle\Write\Event\FeatureWasEnabled; use Pheature\Core\Toggle\Write\Event\FeatureWasDisabled; use Pheature\Core\Toggle\Write\Event\FeatureWasCreated; -use JsonSerializable; use Pheature\Core\Toggle\Write\Event\FeatureWasRemoved; use Pheature\Core\Toggle\Write\Event\StrategyWasAdded; use Pheature\Core\Toggle\Write\Event\StrategyWasRemoved; @@ -15,22 +15,23 @@ use function array_map; use function array_values; +/** + * @psalm-import-type WriteStrategy from Strategy + * @psalm-type FeatureEvents array< + * FeatureWasCreated|FeatureWasEnabled|FeatureWasDisabled|StrategyWasAdded|StrategyWasRemoved|FeatureWasRemoved + * > + * @psalm-type WriteFeature array{feature_id: string, enabled: bool, strategies: array} + */ final class Feature implements JsonSerializable { private FeatureId $featureId; private bool $enabled; /** @var Strategy[] */ private array $strategies = []; - /** @var array */ + /** @var FeatureEvents */ private array $events = []; - /** - * Feature constructor. - * - * @param FeatureId $featureId - * @param bool $enabled - * @param Strategy[] $strategies - */ + /** @param Strategy[] $strategies */ public function __construct(FeatureId $featureId, bool $enabled, array $strategies = []) { $this->featureId = $featureId; @@ -40,9 +41,7 @@ public function __construct(FeatureId $featureId, bool $enabled, array $strategi } } - /** - * @return object[] - */ + /** @return FeatureEvents */ public function release(): array { $events = $this->events; @@ -103,17 +102,13 @@ public function id(): string return $this->featureId->value(); } - /** - * @return Strategy[] - */ + /** @return Strategy[] */ public function strategies(): array { return array_values($this->strategies); } - /** - * @return array - */ + /** @return WriteFeature */ public function jsonSerialize(): array { return [ diff --git a/src/Write/Payload.php b/src/Write/Payload.php index b4d63a1..8ffb6cd 100644 --- a/src/Write/Payload.php +++ b/src/Write/Payload.php @@ -6,18 +6,21 @@ use function json_decode; +/** + * @psalm-type Criteria array + */ final class Payload { - /** @var array */ + /** @var Criteria */ private array $criteria; - /** @param array $criteria */ + /** @param Criteria $criteria */ private function __construct(array $criteria) { $this->criteria = $criteria; } - /** @param array $criteria */ + /** @param Criteria $criteria */ public static function fromArray(array $criteria): self { return new self($criteria); @@ -25,13 +28,13 @@ public static function fromArray(array $criteria): self public static function fromJsonString(string $jsonPayload): self { - /** @var array $payload */ + /** @var Criteria $payload */ $payload = json_decode($jsonPayload, true, 16, JSON_THROW_ON_ERROR); return self::fromArray($payload); } - /** @return array */ + /** @return Criteria */ public function criteria(): array { return $this->criteria; diff --git a/src/Write/Strategy.php b/src/Write/Strategy.php index 19ba2de..111f9af 100644 --- a/src/Write/Strategy.php +++ b/src/Write/Strategy.php @@ -9,26 +9,17 @@ use function array_map; /** - * @phpstan-import-type WriteSegment from Segment - * @phpstan-type WriteStrategy array{strategy_id: string, strategy_type: string, segments: WriteSegment[]} + * @psalm-import-type WriteSegment from Segment * @psalm-type WriteStrategy array{strategy_id: string, strategy_type: string, segments: WriteSegment[]} */ final class Strategy implements JsonSerializable { private StrategyId $strategyId; private StrategyType $strategyType; - /** - * @var Segment[] - */ + /** @var Segment[] */ private array $segments; - /** - * Strategy constructor. - * - * @param StrategyId $strategyId - * @param StrategyType $strategyType - * @param Segment[] $segments - */ + /** @param Segment[] $segments */ public function __construct(StrategyId $strategyId, StrategyType $strategyType, array $segments = []) { $this->strategyId = $strategyId;