Completed
Branch full-rewrite (3b3ffb)
by Thibaud
03:12
created

ResourceUri::fromProtocolAndResource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 2
1
<?php
2
3
namespace Alchemy\Zippy\Resource;
4
5
final class ResourceUri
6
{
7
8
    const DEFAULT_PROTOCOL = 'file';
9
10
    /**
11
     * @param $uri
12
     * @return array
13
     */
14
    private static function getNonEmptyParts($uri)
15
    {
16
        $nonEmptyStringFilter = function ($value) {
17
            return $value != '';
18
        };
19
20
        return array_filter(explode(self::PROTOCOL_SEPARATOR, $uri, 2), $nonEmptyStringFilter);
21
    }
22
23
    const PROTOCOL_SEPARATOR = '://';
24
25
    /**
26
     * @param $parts
27
     * @return bool
28
     */
29
    private static function validateResourceParts($parts)
30
    {
31
        return count($parts) === 2;
32
    }
33
34
    /**
35
     * @param $protocol
36
     * @param $resource
37
     * @return self
38
     */
39
    public static function fromProtocolAndResource($protocol, $resource)
40
    {
41
        return new self($protocol . self::PROTOCOL_SEPARATOR . $resource);
42
    }
43
44
    /**
45
     * @param $uri
46
     * @return bool
47
     */
48
    public static function isValidUri($uri)
49
    {
50
        if (strpos($uri, self::PROTOCOL_SEPARATOR) === false) {
51
            return false;
52
        }
53
54
        $parts = self::getNonEmptyParts($uri);
55
56
        if (! self::validateResourceParts($parts)) {
57
            return false;
58
        }
59
60
        if (strpos($parts[1], self::PROTOCOL_SEPARATOR) !== false) {
61
            return self::isValidUri($parts[1]);
62
        }
63
64
        return true;
65
    }
66
67
    public static function fromString($uri)
68
    {
69
        if (strpos($uri, self::PROTOCOL_SEPARATOR) === false) {
70
            $uri = self::DEFAULT_PROTOCOL . self::PROTOCOL_SEPARATOR . $uri;
71
        }
72
73
        return new self($uri);
74
    }
75
76
    public static function fromStringArray(array $uris)
77
    {
78
        $resourceUris = [];
79
80
        foreach ($uris as $uri) {
81
            $resourceUris[] = self::fromString($uri);
82
        }
83
84
85
        return $resourceUris;
86
    }
87
88
    /**
89
     * @var string
90
     */
91
    private $uri;
92
93
    /**
94
     * @var string
95
     */
96
    private $protocol;
97
98
    /**
99
     * @var string
100
     */
101
    private $resource;
102
103
    /**
104
     * @param string $uri
105
     */
106
    public function __construct($uri)
107
    {
108
        if (! self::isValidUri($uri)) {
109
            throw new \InvalidArgumentException(sprintf(
110
                'Malformed URI: required format is "protocol://resource", got "%s"',
111
                $uri
112
            ));
113
        }
114
115
        $this->uri = $uri;
116
117
        list ($this->protocol, $this->resource) = explode('://', $uri, 2);
118
    }
119
120
    /**
121
     * @return string
122
     */
123
    public function getUri()
124
    {
125
        return $this->uri;
126
    }
127
128
    /**
129
     * @return string
130
     */
131
    public function getProtocol()
132
    {
133
        return $this->protocol;
134
    }
135
136
    /**
137
     * @return string
138
     */
139
    public function getResource()
140
    {
141
        return $this->resource;
142
    }
143
144
    /**
145
     * @return bool
146
     */
147
    public function hasChainedResource()
148
    {
149
        return self::isValidUri($this->resource);
150
    }
151
152
    /**
153
     * @return self
154
     */
155
    public function getChainedResource()
156
    {
157
       return new self($this->resource);
158
    }
159
160
    /**
161
     * @param ResourceUri $other
162
     * @return bool
163
     */
164
    public function equals(ResourceUri $other)
165
    {
166
        return $this->getUri() == $other->getUri();
167
    }
168
169
    /**
170
     * @return string
171
     */
172
    public function __toString()
173
    {
174
        return $this->uri;
175
    }
176
}
177