Skip to content

Commit

Permalink
[#45] define psalm types for arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
kpicaza committed Nov 6, 2021
1 parent 8eaaeca commit 1d74c6d
Show file tree
Hide file tree
Showing 10 changed files with 73 additions and 93 deletions.
6 changes: 0 additions & 6 deletions src/Read/ChainSegmentFactory.php
Expand Up @@ -16,12 +16,6 @@ public function __construct(SegmentFactory ...$segmentFactories)
$this->segmentFactories = $segmentFactories;
}

/**
* @param string $segmentId
* @param string $segmentType
* @param array<string, mixed> $criteria
* @return Segment
*/
public function create(string $segmentId, string $segmentType, array $criteria): Segment
{
foreach ($this->segmentFactories as $segmentFactory) {
Expand Down
42 changes: 18 additions & 24 deletions src/Read/ChainToggleStrategyFactory.php
Expand Up @@ -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;
Expand All @@ -22,32 +25,23 @@ public function __construct(SegmentFactory $segmentFactory, ToggleStrategyFactor
$this->toggleStrategyFactories = $toggleStrategyFactories;
}

/**
* @param array<string, mixed> $strategy
* @return ToggleStrategy
*/
/** @param WriteStrategy $strategy */
public function createFromArray(array $strategy): ToggleStrategy
{
/** @var array<array<string, string|array<string, mixed>>> $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<string, mixed> $criteria */
$criteria = $segment['criteria'];

return $this->segmentFactory->create($segmentId, $segmentType, $criteria);
},
$segments
)));
return $this->create(
$strategy['strategy_id'],
$strategy['strategy_type'],
new Segments(...array_map(
function (array $segment): Segment {
return $this->segmentFactory->create(
$segment['segment_id'],
$segment['segment_type'],
$segment['criteria']
);
},
$strategy['segments']
))
);
}

public function create(string $strategyId, string $strategyType, ?Segments $segments = null): ToggleStrategy
Expand Down
6 changes: 6 additions & 0 deletions src/Read/Feature.php
Expand Up @@ -6,9 +6,15 @@

use JsonSerializable;

/**
* @psalm-import-type ReadStrategies from ToggleStrategies
* @psalm-type ReadFeature array{id: string, is_enabled: bool, strategies: array<ReadStrategies>}
*/
interface Feature extends JsonSerializable
{
public function id(): string;
public function strategies(): ToggleStrategies;
public function isEnabled(): bool;
/** @return ReadFeature */
public function jsonSerialize(): array;
}
19 changes: 9 additions & 10 deletions src/Read/Segment.php
Expand Up @@ -6,21 +6,20 @@

use JsonSerializable;

/**
* @psalm-type SegmentPayload array<mixed>
* @psalm-type ReadSegment array{id: string, type: string, criteria: SegmentPayload}
*/
interface Segment extends JsonSerializable
{
public function id(): string;
public function type(): string;
/**
* @return array<string, mixed>
*/
/** @return SegmentPayload */
public function criteria(): array;
/**
* @param array<string, mixed> $payload
* @return bool
*/
/** @param SegmentPayload $payload */
public function match(array $payload): bool;
/**
* @return array<string, string|array<string, mixed>>
*/
/** @return ReadSegment */
public function toArray(): array;
/** @return ReadSegment */
public function jsonSerialize(): array;
}
10 changes: 4 additions & 6 deletions src/Read/SegmentFactory.php
Expand Up @@ -4,13 +4,11 @@

namespace Pheature\Core\Toggle\Read;

/**
* @psalm-import-type SegmentPayload from Segment
*/
interface SegmentFactory extends WithProcessableFixedTypes
{
/**
* @param string $segmentId
* @param string $segmentType
* @param array<string, mixed> $criteria
* @return Segment
*/
/** @param SegmentPayload $criteria */
public function create(string $segmentId, string $segmentType, array $criteria): Segment;
}
14 changes: 5 additions & 9 deletions src/Read/ToggleStrategies.php
Expand Up @@ -11,13 +11,13 @@
use function count;

/**
* @psalm-import-type ReadStrategy from ToggleStrategy
* @psalm-type ReadStrategies array<array-key, ReadStrategy>
* @implements IteratorAggregate<ToggleStrategy>
*/
final class ToggleStrategies implements IteratorAggregate, JsonSerializable
{
/**
* @var ToggleStrategy[]
*/
/** @var ToggleStrategy[] */
private array $strategies;

public function __construct(ToggleStrategy ...$strategies)
Expand All @@ -30,17 +30,13 @@ public function count(): int
return count($this->strategies);
}

/**
* @return Generator<ToggleStrategy>
*/
/** @return Generator<ToggleStrategy> */
public function getIterator(): Generator
{
yield from $this->strategies;
}

/**
* @return array<array<mixed>>
*/
/** @return ReadStrategies */
public function jsonSerialize(): array
{
return array_map(
Expand Down
10 changes: 7 additions & 3 deletions src/Read/ToggleStrategy.php
Expand Up @@ -6,13 +6,17 @@

use JsonSerializable;

/**
* @psalm-import-type ReadSegment from Segment
* @psalm-type ReadStrategy array{id: string, segments: array<ReadSegment>, type: string}
*/
interface ToggleStrategy extends JsonSerializable
{
public function id(): string;
public function type(): string;
public function isSatisfiedBy(ConsumerIdentity $identity): bool;
/**
* @return array<string, string|int>
*/
/** @return ReadStrategy */
public function toArray(): array;
/** @return ReadStrategy */
public function jsonSerialize(): array;
}
31 changes: 13 additions & 18 deletions src/Write/Feature.php
Expand Up @@ -4,33 +4,34 @@

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;

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<WriteStrategy>}
*/
final class Feature implements JsonSerializable
{
private FeatureId $featureId;
private bool $enabled;
/** @var Strategy[] */
private array $strategies = [];
/** @var array<object> */
/** @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;
Expand All @@ -40,9 +41,7 @@ public function __construct(FeatureId $featureId, bool $enabled, array $strategi
}
}

/**
* @return object[]
*/
/** @return FeatureEvents */
public function release(): array
{
$events = $this->events;
Expand Down Expand Up @@ -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<string, mixed>
*/
/** @return WriteFeature */
public function jsonSerialize(): array
{
return [
Expand Down
13 changes: 8 additions & 5 deletions src/Write/Payload.php
Expand Up @@ -6,32 +6,35 @@

use function json_decode;

/**
* @psalm-type Criteria array<array-key, mixed>
*/
final class Payload
{
/** @var array<array-key, mixed> */
/** @var Criteria */
private array $criteria;

/** @param array<array-key, mixed> $criteria */
/** @param Criteria $criteria */
private function __construct(array $criteria)
{
$this->criteria = $criteria;
}

/** @param array<array-key, mixed> $criteria */
/** @param Criteria $criteria */
public static function fromArray(array $criteria): self
{
return new self($criteria);
}

public static function fromJsonString(string $jsonPayload): self
{
/** @var array<array-key, mixed> $payload */
/** @var Criteria $payload */
$payload = json_decode($jsonPayload, true, 16, JSON_THROW_ON_ERROR);

return self::fromArray($payload);
}

/** @return array<array-key, mixed> */
/** @return Criteria */
public function criteria(): array
{
return $this->criteria;
Expand Down
15 changes: 3 additions & 12 deletions src/Write/Strategy.php
Expand Up @@ -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;
Expand Down

0 comments on commit 1d74c6d

Please sign in to comment.