Completed
Pull Request — master (#64)
by Frederik
03:38 queued 01:09
created

MessageStream::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 2.0002

Importance

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