Passed
Push — master ( 19cfa8...a714a7 )
by Thorsten
02:07
created

Url::parseFragment()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 2
eloc 2
nc 1
nop 1
crap 2
1
<?php
2
3
namespace Daikon\Entity\ValueObject;
4
5
use Daikon\Entity\Assert\Assertion;
6
7
final class Url implements ValueObjectInterface
8
{
9
    /**
10
     * @var string
11
     */
12
    private const NIL = '';
13
14
    /**
15
     * @var string
16
     */
17
    private const DEFAULT_PATH = '/';
18
19
    /**
20
     * @var Text
21
     */
22
    private $fragment;
23
24
    /**
25
     * @var Text
26
     */
27
    private $host;
28
29
    /*
30
     * @var Text
31
     */
32
    private $scheme;
33
34
    /**
35
     * @var Text
36
     */
37
    private $query;
38
39
    /**
40
     * @var Integer
41
     */
42
    private $port;
43
44
    /**
45
     * @var Text
46
     */
47
    private $path;
48
49
    /**
50
     * @param string|null $nativeValue
51
     * @return Url
52
     */
53 22
    public static function fromNative($nativeValue): Url
54
    {
55 22
        Assertion::nullOrUrl($nativeValue, 'Trying to create Url VO from unsupported value type.');
56 22
        return empty($nativeValue) ? new Url : new Url($nativeValue);
57
    }
58
59 4
    public function toNative(): string
60
    {
61 4
        if ($this->host->isEmpty()) {
62 1
            return self::NIL;
63
        }
64 4
        return sprintf(
65 4
            '%s://%s%s%s%s%s',
66 4
            $this->scheme,
67 4
            $this->host,
68 4
            $this->formatPort(),
69 4
            $this->path,
70 4
            $this->formatQuery(),
71 4
            $this->formatFragment()
72
        );
73
    }
74
75 1
    public function equals(ValueObjectInterface $otherValue): bool
76
    {
77 1
        return $otherValue instanceof Url && $otherValue->toNative() === $this->toNative();
78
    }
79
80 1
    public function __toString(): string
81
    {
82 1
        return $this->toNative();
83
    }
84
85 1
    public function getPath(): Text
86
    {
87 1
        return $this->path;
88
    }
89
90 1
    public function getPort(): Integer
91
    {
92 1
        return $this->port;
93
    }
94
95 1
    public function getFragment(): Text
96
    {
97 1
        return $this->fragment;
98
    }
99
100 1
    public function getHost(): Text
101
    {
102 1
        return $this->host;
103
    }
104
105 1
    public function getQuery(): Text
106
    {
107 1
        return $this->query;
108
    }
109
110 1
    public function getScheme(): Text
111
    {
112 1
        return $this->scheme;
113
    }
114
115 22
    private function __construct(string $url = self::NIL)
116
    {
117 22
        $this->host = $this->parseHost($url);
118 22
        $this->scheme = $this->parseScheme($url);
119 22
        $this->query = $this->parseQuery($url);
120 22
        $this->port = $this->parsePort($url);
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->parsePort($url) of type object<Daikon\Entity\ValueObject\Integer> is incompatible with the declared type integer of property $port.

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...
121 22
        $this->fragment = $this->parseFragment($url);
122 22
        $this->path = $this->parsePath($url);
123 22
    }
124
125 22
    private function parseHost(string $url): Text
126
    {
127 22
        return Text::fromNative(parse_url($url, PHP_URL_HOST) ?: self::NIL);
128
    }
129
130 22
    private function parseScheme(string $url): Text
131
    {
132 22
        return Text::fromNative(parse_url($url, PHP_URL_SCHEME) ?: self::NIL);
133
    }
134
135 22
    private function parseQuery(string $url): Text
136
    {
137 22
        return Text::fromNative(parse_url($url, PHP_URL_QUERY) ?: self::NIL);
138
    }
139
140 22
    private function parseFragment(string $url): Text
141
    {
142 22
        return Text::fromNative(parse_url($url, PHP_URL_FRAGMENT) ?: self::NIL);
143
    }
144
145 22
    private function parsePath(string $url): Text
146
    {
147 22
        return Text::fromNative(parse_url($url, PHP_URL_PATH) ?: self::DEFAULT_PATH);
148
    }
149
150 22
    private function parsePort(string $url): Integer
151
    {
152 22
        return Integer::fromNative(parse_url($url, PHP_URL_PORT) ?: null);
153
    }
154
155 4
    private function formatPort(): string
156
    {
157 4
        $port = $this->port->toNative();
0 ignored issues
show
Bug introduced by
The method toNative cannot be called on $this->port (of type integer).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
158 4
        if (is_null($port)) {
159 2
            return '';
160
        }
161 3
        return ':'.$port;
162
    }
163
164 4
    private function formatQuery(): string
165
    {
166 4
        if ($this->query->isEmpty()) {
167 2
            return (string)$this->query;
168
        }
169 3
        return '?'.$this->query;
170
    }
171
172 4
    private function formatFragment(): string
173
    {
174 4
        if ($this->fragment->isEmpty()) {
175 2
            return (string)$this->fragment;
176
        }
177 3
        return '#'.$this->fragment;
178
    }
179
}
180