Passed
Pull Request — master (#22)
by Sergei
15:13
created

PathPattern::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
nc 1
nop 1
dl 0
loc 6
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Files\PathMatch;
6
7
use Yiisoft\Strings\WildcardPattern;
8
9
/**
10
 * A shell path pattern to match against.
11
 * Based on {@see WildcardPattern}.
12
 */
13
final class PathPattern implements PathMatcherInterface
14
{
15
    private const FILES = 1;
16
    private const DIRECTORIES = 2;
17
18
    private WildcardPattern $pattern;
19
    private ?int $matchOnly = null;
20
21
    /**
22
     * @param string $pattern The path pattern to match against.
23
     */
24
    public function __construct(string $pattern)
25
    {
26
        $this->pattern = (new WildcardPattern($pattern))
27
            ->withExactSlashes()
28
            ->ignoreCase()
29
            ->withEnding();
30
    }
31
32
    /**
33
     * Make pattern case sensitive.
34
     * @return self
35
     */
36
    public function caseSensitive(): self
37
    {
38
        $new = clone $this;
39
        $new->pattern = $this->pattern->ignoreCase(false);
40
        return $new;
41
    }
42
43
    /**
44
     * Match full path, not just ending of path.
45
     * @return self
46
     */
47
    public function withFullPath(): self
48
    {
49
        $new = clone $this;
50
        $new->pattern = $this->pattern->withEnding(false);
51
        return $new;
52
    }
53
54
    /**
55
     * Match `/` character with wildcards.
56
     * @return self
57
     */
58
    public function withNotExactSlashes(): self
59
    {
60
        $new = clone $this;
61
        $new->pattern = $this->pattern->withExactSlashes(false);
62
        return $new;
63
    }
64
65
    /**
66
     * If path is not file match return null
67
     * @return self
68
     */
69
    public function onlyFiles(): self
70
    {
71
        $new = clone $this;
72
        $new->matchOnly = self::FILES;
73
        return $new;
74
    }
75
76
    /**
77
     * If path is not directory match return null
78
     * @return self
79
     */
80
    public function onlyDirectories(): self
81
    {
82
        $new = clone $this;
83
        $new->matchOnly = self::DIRECTORIES;
84
        return $new;
85
    }
86
87
    /**
88
     * Checks if the passed path would match the given shell path pattern.
89
     *
90
     * @param string $path The tested path.
91
     * @return bool|null Whether the path matches pattern or not.
92
     */
93
    public function match(string $path): ?bool
94
    {
95
        if (
96
            file_exists($path) &&
97
            (
98
                ($this->matchOnly === self::FILES && !is_file($path)) ||
99
                ($this->matchOnly === self::DIRECTORIES && !is_dir($path))
100
            )
101
        ) {
102
            return null;
103
        }
104
105
        return $this->pattern->match($path);
106
    }
107
}
108