AbstractPass::afterRun()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 8
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 2
nop 1
crap 3
1
<?php declare(strict_types=1);
2
3
/**
4
* @package   s9e\RegexpBuilder
5
* @copyright Copyright (c) 2016-2022 The s9e authors
6
* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
7
*/
8
namespace s9e\RegexpBuilder\Passes;
9
10
abstract class AbstractPass implements PassInterface
11
{
12
	/**
13
	* @var bool Whether the current set of strings is optional
14
	*/
15
	protected $isOptional;
16
17
	/**
18
	* {@inheritdoc}
19
	*/
20 35
	public function run(array $strings): array
21
	{
22 35
		$strings = $this->beforeRun($strings);
23 35
		if ($this->canRun($strings))
24
		{
25 32
			$strings = $this->runPass($strings);
26
		}
27 35
		$strings = $this->afterRun($strings);
28
29 35
		return $strings;
30
	}
31
32
	/**
33
	* Process the list of strings after the pass is run
34
	*
35
	* @param  array[] $strings
36
	* @return array[]
37
	*/
38 35
	protected function afterRun(array $strings): array
39
	{
40 35
		if ($this->isOptional && $strings[0] !== [])
41
		{
42 6
			array_unshift($strings, []);
43
		}
44
45 35
		return $strings;
46
	}
47
48
	/**
49
	* Prepare the list of strings before the pass is run
50
	*
51
	* @param  array[] $strings
52
	* @return array[]
53
	*/
54 35
	protected function beforeRun(array $strings): array
55
	{
56 35
		$this->isOptional = (isset($strings[0]) && $strings[0] === []);
57 35
		if ($this->isOptional)
58
		{
59 10
			array_shift($strings);
60
		}
61
62 35
		return $strings;
63
	}
64
65
	/**
66
	* Test whether this pass can be run on a given list of strings
67
	*
68
	* @param  array[] $strings
69
	* @return bool
70
	*/
71 19
	protected function canRun(array $strings): bool
72
	{
73 19
		return true;
74
	}
75
76
	/**
77
	* Run this pass on a list of strings
78
	*
79
	* @param  array[] $strings
80
	* @return array[]
81
	*/
82
	abstract protected function runPass(array $strings): array;
83
84
	/**
85
	* Test whether given string has an optional suffix
86
	*
87
	* @param  array $string
88
	* @return bool
89
	*/
90 8
	protected function hasOptionalSuffix(array $string): bool
91
	{
92 8
		$suffix = end($string);
93
94 8
		return (is_array($suffix) && $suffix[0] === []);
95
	}
96
97
	/**
98
	* Test whether given string contains a single alternation made of single values
99
	*
100
	* @param  array $string
101
	* @return bool
102
	*/
103 8
	protected function isCharacterClassString(array $string): bool
104
	{
105 8
		return ($this->isSingleAlternationString($string) && $this->isSingleCharStringList($string[0]));
106
	}
107
108
	/**
109
	* Test whether given string contains one single element that is an alternation
110
	*
111
	* @param  array $string
112
	* @return bool
113
	*/
114 8
	protected function isSingleAlternationString(array $string): bool
115
	{
116 8
		return (count($string) === 1 && is_array($string[0]));
117
	}
118
119
	/**
120
	* Test whether given string contains a single character value
121
	*
122
	* @param  array $string
123
	* @return bool
124
	*/
125 6
	protected function isSingleCharString(array $string): bool
126
	{
127 6
		return (count($string) === 1 && !is_array($string[0]));
128
	}
129
130
	/**
131
	* Test whether given list of strings contains nothing but single-char strings
132
	*
133
	* @param  array[] $strings
134
	* @return bool
135
	*/
136 2
	protected function isSingleCharStringList(array $strings): bool
137
	{
138 2
		foreach ($strings as $string)
139
		{
140 2
			if (!$this->isSingleCharString($string))
141
			{
142 1
				return false;
143
			}
144
		}
145
146 1
		return true;
147
	}
148
}