1<?php
2
3declare(strict_types=1);
4
5namespace GuzzleHttp\Psr7;
6
7use Psr\Http\Message\StreamInterface;
8
9/**
10 * Lazily reads or writes to a file that is opened only after an IO operation
11 * take place on the stream.
12 */
13final class LazyOpenStream implements StreamInterface
14{
15    use StreamDecoratorTrait;
16
17    /** @var string */
18    private $filename;
19
20    /** @var string */
21    private $mode;
22
23    /**
24     * @var StreamInterface
25     */
26    private $stream;
27
28    /**
29     * @param string $filename File to lazily open
30     * @param string $mode     fopen mode to use when opening the stream
31     */
32    public function __construct(string $filename, string $mode)
33    {
34        $this->filename = $filename;
35        $this->mode = $mode;
36
37        // unsetting the property forces the first access to go through
38        // __get().
39        unset($this->stream);
40    }
41
42    /**
43     * Creates the underlying stream lazily when required.
44     */
45    protected function createStream(): StreamInterface
46    {
47        return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode));
48    }
49}
50