LazyStream::tell()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Genkgo\Mail\Stream;
5
6
use Genkgo\Mail\StreamInterface;
7
8
final class LazyStream implements StreamInterface
9
{
10
    /**
11
     * @var \Closure
12
     */
13
    private $callback;
14
15
    /**
16
     * @var StreamInterface
17
     */
18
    private $decoratedStream;
19
20
    /**
21
     * @param \Closure $callback
22
     */
23 59
    public function __construct(\Closure $callback)
24
    {
25 59
        $this->callback = $callback;
26 59
    }
27
28
    /**
29
     * @return string
30
     */
31 58
    public function __toString(): string
32
    {
33 58
        return $this->getStream()->__toString();
34
    }
35
    
36
    public function close(): void
37
    {
38
        $this->getStream()->close();
39
    }
40
41
    /**
42
     * @return mixed
43
     */
44
    public function detach()
45
    {
46
        return $this->getStream()->detach();
47
    }
48
49
    /**
50
     * @return int|null
51
     */
52
    public function getSize(): ?int
53
    {
54
        return $this->getStream()->getSize();
55
    }
56
57
    /**
58
     * @return int
59
     * @throws \RuntimeException
60
     */
61
    public function tell(): int
62
    {
63
        return $this->getStream()->tell();
64
    }
65
66
    /**
67
     * @return bool
68
     */
69 2
    public function eof(): bool
70
    {
71 2
        return $this->getStream()->eof();
72
    }
73
74
    /**
75
     * @return bool
76
     */
77
    public function isSeekable(): bool
78
    {
79
        return $this->getStream()->isSeekable();
80
    }
81
82
    /**
83
     * @param int $offset
84
     * @param int $whence
85
     * @return int
86
     */
87
    public function seek(int $offset, int $whence = SEEK_SET): int
88
    {
89
        return $this->getStream()->seek($offset, $whence);
90
    }
91
92
    /**
93
     * @return bool
94
     */
95 2
    public function rewind(): bool
96
    {
97 2
        return $this->getStream()->rewind();
98
    }
99
100
    /**
101
     * @return bool
102
     */
103
    public function isWritable(): bool
104
    {
105
        return false;
106
    }
107
108
    /**
109
     * @param string $string
110
     * @return int
111
     */
112
    public function write($string): int
113
    {
114
        throw new \RuntimeException('Cannot write to stream');
115
    }
116
117
    /**
118
     * @return bool
119
     */
120
    public function isReadable(): bool
121
    {
122
        return true;
123
    }
124
125
    /**
126
     * @param int $length
127
     * @return string
128
     */
129 2
    public function read(int $length): string
130
    {
131 2
        return $this->getStream()->read($length);
132
    }
133
134
    /**
135
     * @return string
136
     */
137
    public function getContents(): string
138
    {
139
        return $this->getStream()->getContents();
140
    }
141
142
    /**
143
     * @param array<int, string> $keys
144
     * @return array<string, mixed>
0 ignored issues
show
Documentation introduced by
The doc-type array<string, could not be parsed: Expected ">" at position 5, but found "end of type". (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
145
     */
146
    public function getMetadata(array $keys = []): array
147
    {
148
        return $this->getStream()->getMetadata();
149
    }
150
151
    /**
152
     * @return StreamInterface
153
     */
154 59
    private function getStream(): StreamInterface
155
    {
156 59
        if ($this->decoratedStream === null) {
157 59
            $callback = $this->callback;
158 59
            $this->decoratedStream = $callback();
159
        }
160
161 59
        return $this->decoratedStream;
162
    }
163
}
164