Completed
Pull Request — master (#83)
by Frederik
02:26 queued 49s
created

HeaderDecodedStream::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Genkgo\Mail\Stream;
5
6
use Genkgo\Mail\HeaderInterface;
7
use Genkgo\Mail\Mime\PartInterface;
8
use Genkgo\Mail\StreamInterface;
9
10
final class HeaderDecodedStream implements StreamInterface
11
{
12
    /**
13
     * @var StreamInterface
14
     */
15
    private $decoratedStream;
16
17
    /**
18
     * @param HeaderInterface $header
19
     */
20 8
    public function __construct(HeaderInterface $header)
21
    {
22 8
        $this->decoratedStream = $this->calculateOptimalStream($header);
23 8
    }
24
25
    /**
26
     * @param HeaderInterface $header
27
     * @return StreamInterface
28
     */
29 8
    private function calculateOptimalStream(HeaderInterface $header): StreamInterface
30
    {
31 8
        $decodedHeader = \iconv_mime_decode((string)$header->getValue(), \ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8');
32 8
        if ($decodedHeader === false) {
33
            throw new \RuntimeException('Cannot decode header');
34
        }
35
36 8
        return new StringStream((string)$decodedHeader);
37
    }
38
39
    /**
40
     * @return string
41
     */
42 3
    public function __toString(): string
43
    {
44 3
        return $this->decoratedStream->__toString();
45
    }
46
47
    public function close(): void
48
    {
49
        $this->decoratedStream->close();
50
    }
51
52
    /**
53
     * @return mixed
54
     */
55
    public function detach()
56
    {
57
        return $this->decoratedStream->detach();
58
    }
59
60
    /**
61
     * @return int|null
62
     */
63 1
    public function getSize(): ?int
64
    {
65 1
        return $this->decoratedStream->getSize();
66
    }
67
68
    /**
69
     * @return int
70
     * @throws \RuntimeException
71
     */
72 1
    public function tell(): int
73
    {
74 1
        return $this->decoratedStream->tell();
75
    }
76
77
    /**
78
     * @return bool
79
     */
80
    public function eof(): bool
81
    {
82
        return $this->decoratedStream->eof();
83
    }
84
85
    /**
86
     * @return bool
87
     */
88
    public function isSeekable(): bool
89
    {
90
        return $this->decoratedStream->isSeekable();
91
    }
92
93
    /**
94
     * @param int $offset
95
     * @param int $whence
96
     * @return int
97
     */
98 1
    public function seek(int $offset, int $whence = SEEK_SET): int
99
    {
100 1
        return $this->decoratedStream->seek($offset, $whence);
101
    }
102
103
    /**
104
     * @return bool
105
     */
106 1
    public function rewind(): bool
107
    {
108 1
        return $this->decoratedStream->rewind();
109
    }
110
111
    /**
112
     * @return bool
113
     */
114 1
    public function isWritable(): bool
115
    {
116 1
        return false;
117
    }
118
119
    /**
120
     * @param string $string
121
     * @return int
122
     */
123 1
    public function write($string): int
124
    {
125 1
        throw new \RuntimeException('Cannot write to a decoded stream');
126
    }
127
128
    /**
129
     * @return bool
130
     */
131
    public function isReadable(): bool
132
    {
133
        return $this->decoratedStream->isReadable();
134
    }
135
136
    /**
137
     * @param int $length
138
     * @return string
139
     */
140 1
    public function read(int $length): string
141
    {
142 1
        return $this->decoratedStream->read($length);
143
    }
144
145
    /**
146
     * @return string
147
     */
148 3
    public function getContents(): string
149
    {
150 3
        return $this->decoratedStream->getContents();
151
    }
152
153
    /**
154
     * @param array<int, string> $keys
155
     * @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...
156
     */
157
    public function getMetadata(array $keys = []): array
158
    {
159
        return $this->decoratedStream->getMetadata();
160
    }
161
}
162