Completed
Pull Request — master (#87)
by Frederik
01:29
created

ParsedFetchCommandResponse   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 82.86%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 2
dl 0
loc 111
ccs 29
cts 35
cp 0.8286
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
B __construct() 0 31 6
A __toString() 0 4 1
A assertCompletion() 0 4 1
A assertContinuation() 0 4 1
A assertTagged() 0 4 1
A getBody() 0 8 1
A getNumber() 0 4 1
A getItemList() 0 4 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Genkgo\Mail\Protocol\Imap\Response\Command;
5
6
use Genkgo\Mail\Exception\AssertionFailedException;
7
use Genkgo\Mail\Protocol\Imap\MessageData\ItemList;
8
use Genkgo\Mail\Protocol\Imap\Response\CompletionResult;
9
use Genkgo\Mail\Protocol\Imap\ResponseInterface;
10
11
final class ParsedFetchCommandResponse implements ResponseInterface
12
{
13
    /**
14
     * @var int
15
     */
16
    private $number;
17
18
    /**
19
     * @var ItemList
20
     */
21
    private $itemList;
22
23
    /**
24
     * @param \Iterator $lineIterator
25
     */
26 7
    public function __construct(\Iterator $lineIterator)
27
    {
28 7
        $line = $lineIterator->current();
29 7
        if (\substr($line, 0, 2) !== '* ') {
30
            throw new \InvalidArgumentException('Expecting an untagged response');
31
        }
32
33 7
        $lineContent = \substr($line, 2);
34
35 7
        $fetchStart = \preg_match('/^([0-9]+) FETCH (.*)$/s', $lineContent, $matches);
36 7
        if ($fetchStart !== 1) {
37
            throw new \InvalidArgumentException('Expecting a fetch command response');
38
        }
39
40 7
        $this->number = (int)$matches[1];
41 7
        $this->itemList = ItemList::fromBytes(
0 ignored issues
show
Documentation Bug introduced by
It seems like \Genkgo\Mail\Protocol\Im...; } } })()) of type object<self> is incompatible with the declared type object<Genkgo\Mail\Proto...p\MessageData\ItemList> of property $itemList.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
42
            (function () use ($matches, $lineIterator) {
43 7
                foreach (\str_split($matches[2]) as $char) {
44 7
                    yield $char;
45
                }
46
47 5
                while ($lineIterator->valid()) {
48 5
                    $lineIterator->next();
49
50 5
                    foreach (\str_split($lineIterator->current()) as $char) {
51 5
                        yield $char;
52
                    }
53
                }
54 7
            })()
55
        );
56 7
    }
57
58
    /**
59
     * @return string
60
     */
61 2
    public function __toString(): string
62
    {
63 2
        return \sprintf("* %s\r\n", $this->getBody());
64
    }
65
66
    /**
67
     * @param CompletionResult $expectedResult
68
     * @return ResponseInterface
69
     * @throws AssertionFailedException
70
     */
71 1
    public function assertCompletion(CompletionResult $expectedResult): ResponseInterface
72
    {
73 1
        throw new AssertionFailedException('A parsed fetch command response is a completion result');
74
    }
75
76
    /**
77
     * @return ResponseInterface
78
     * @throws AssertionFailedException
79
     */
80
    public function assertContinuation(): ResponseInterface
81
    {
82
        throw new AssertionFailedException();
83
    }
84
85
    /**
86
     * @return ResponseInterface
87
     * @throws AssertionFailedException
88
     */
89
    public function assertTagged(): ResponseInterface
90
    {
91
        throw new AssertionFailedException('An untagged response is never tagged');
92
    }
93
94
    /**
95
     * @return string
96
     */
97 4
    public function getBody(): string
98
    {
99 4
        return \sprintf(
100 4
            '%s FETCH %s',
101 4
            $this->number,
102 4
            (string)$this->itemList
103
        );
104
    }
105
106
    /**
107
     * @return int
108
     */
109 1
    public function getNumber(): int
110
    {
111 1
        return $this->number;
112
    }
113
114
    /**
115
     * @return ItemList
116
     */
117 1
    public function getItemList(): ItemList
118
    {
119 1
        return $this->itemList;
120
    }
121
}
122
123