Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#45] define psalm types for arrays #46

Merged
merged 1 commit into from Nov 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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