done() || !$stream->forward() instanceof OpeningBracketToken) { throw new ValueOfOpeningBracketMissing(); } if ($stream->done()) { throw new ValueOfMissingSubType(); } $subType = $stream->read(); if ($stream->done() || !$stream->forward() instanceof ClosingBracketToken) { throw new ValueOfClosingBracketMissing($subType); } if (! $subType instanceof EnumType) { throw new ValueOfIncorrectSubType($subType); } if (! is_a($subType->className(), BackedEnum::class, true)) { throw new ValueOfIncorrectSubType($subType); } $cases = array_map( // @phpstan-ignore-next-line / We know it's a BackedEnum fn (BackedEnum $case) => ValueTypeFactory::from($case->value), array_values($subType->cases()), ); if (count($cases) > 1) { return UnionType::from(...$cases); } return $cases[0]; } public function symbol(): string { return 'value-of'; } }