| Total Complexity | 14 |
| Total Lines | 66 |
| Duplicated Lines | 0 % |
| Coverage | 94.59% |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
| 1 | <?php |
||
| 15 | final class SmartStreamFactory |
||
| 16 | { |
||
| 17 | private ConverterMatcherInterface $converterMatcher; |
||
| 18 | private string $defaultBucketClass = DataBucket::class; |
||
| 19 | private array $factories = []; |
||
| 20 | |||
| 21 | 16 | public function __construct( |
|
| 22 | StreamFactoryInterface $defaultFactory, |
||
| 23 | ConverterMatcherInterface $converterMatcher |
||
| 24 | ) { |
||
| 25 | 16 | $this->converterMatcher = $converterMatcher; |
|
| 26 | |||
| 27 | 16 | $this->addStreamFactory(static fn($data) => $data instanceof \Generator ? new GeneratorStream($data) : null); |
|
| 28 | 16 | $this->addStreamFactory(function ($data) use ($defaultFactory) { |
|
| 29 | switch (true) { |
||
| 30 | 15 | case is_string($data): |
|
| 31 | 2 | return $defaultFactory->createStream($data); |
|
| 32 | 13 | case is_resource($data): |
|
| 33 | 1 | return $defaultFactory->createStreamFromResource($data); |
|
| 34 | 12 | case $data instanceof \SplFileInfo: |
|
| 35 | 1 | return $defaultFactory->createStreamFromFile($data->getPathname()); |
|
| 36 | } |
||
| 37 | 11 | return null; |
|
| 38 | 16 | }); |
|
| 39 | 16 | } |
|
| 40 | |||
| 41 | 4 | public function withDefaultBucketClass(string $bucketClass): self |
|
| 42 | { |
||
| 43 | 4 | $clone = clone $this; |
|
| 44 | 4 | if (!is_subclass_of($bucketClass, DataBucket::class, true)) { |
|
| 45 | 1 | throw new \InvalidArgumentException('Bucket class should be subclass of DataBucket.'); |
|
| 46 | } |
||
| 47 | 4 | $clone->defaultBucketClass = $bucketClass; |
|
| 48 | 4 | return $clone; |
|
| 49 | } |
||
| 50 | |||
| 51 | /** |
||
| 52 | * Last added factory called first |
||
| 53 | */ |
||
| 54 | 1 | public function withStreamFactory(Closure $factory): self |
|
| 55 | { |
||
| 56 | 1 | $clone = clone $this; |
|
| 57 | 1 | $clone->addStreamFactory($factory); |
|
| 58 | 1 | return $clone; |
|
| 59 | } |
||
| 60 | |||
| 61 | 16 | private function addStreamFactory(Closure $factory): void |
|
| 64 | 16 | } |
|
| 65 | |||
| 66 | 15 | public function createStream($data, ?RequestInterface $request = null): StreamInterface |
|
| 81 | ); |
||
| 82 | } |
||
| 83 | } |
||
| 84 |