Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Prophecy.
|
Chris@0
|
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
Chris@0
|
6 * Marcello Duarte <marcello.duarte@gmail.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Prophecy\Argument;
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * Arguments wildcarding.
|
Chris@0
|
16 *
|
Chris@0
|
17 * @author Konstantin Kudryashov <ever.zet@gmail.com>
|
Chris@0
|
18 */
|
Chris@0
|
19 class ArgumentsWildcard
|
Chris@0
|
20 {
|
Chris@0
|
21 /**
|
Chris@0
|
22 * @var Token\TokenInterface[]
|
Chris@0
|
23 */
|
Chris@0
|
24 private $tokens = array();
|
Chris@0
|
25 private $string;
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * Initializes wildcard.
|
Chris@0
|
29 *
|
Chris@0
|
30 * @param array $arguments Array of argument tokens or values
|
Chris@0
|
31 */
|
Chris@0
|
32 public function __construct(array $arguments)
|
Chris@0
|
33 {
|
Chris@0
|
34 foreach ($arguments as $argument) {
|
Chris@0
|
35 if (!$argument instanceof Token\TokenInterface) {
|
Chris@0
|
36 $argument = new Token\ExactValueToken($argument);
|
Chris@0
|
37 }
|
Chris@0
|
38
|
Chris@0
|
39 $this->tokens[] = $argument;
|
Chris@0
|
40 }
|
Chris@0
|
41 }
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * Calculates wildcard match score for provided arguments.
|
Chris@0
|
45 *
|
Chris@0
|
46 * @param array $arguments
|
Chris@0
|
47 *
|
Chris@0
|
48 * @return false|int False OR integer score (higher - better)
|
Chris@0
|
49 */
|
Chris@0
|
50 public function scoreArguments(array $arguments)
|
Chris@0
|
51 {
|
Chris@0
|
52 if (0 == count($arguments) && 0 == count($this->tokens)) {
|
Chris@0
|
53 return 1;
|
Chris@0
|
54 }
|
Chris@0
|
55
|
Chris@0
|
56 $arguments = array_values($arguments);
|
Chris@0
|
57 $totalScore = 0;
|
Chris@0
|
58 foreach ($this->tokens as $i => $token) {
|
Chris@0
|
59 $argument = isset($arguments[$i]) ? $arguments[$i] : null;
|
Chris@0
|
60 if (1 >= $score = $token->scoreArgument($argument)) {
|
Chris@0
|
61 return false;
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 $totalScore += $score;
|
Chris@0
|
65
|
Chris@0
|
66 if (true === $token->isLast()) {
|
Chris@0
|
67 return $totalScore;
|
Chris@0
|
68 }
|
Chris@0
|
69 }
|
Chris@0
|
70
|
Chris@0
|
71 if (count($arguments) > count($this->tokens)) {
|
Chris@0
|
72 return false;
|
Chris@0
|
73 }
|
Chris@0
|
74
|
Chris@0
|
75 return $totalScore;
|
Chris@0
|
76 }
|
Chris@0
|
77
|
Chris@0
|
78 /**
|
Chris@0
|
79 * Returns string representation for wildcard.
|
Chris@0
|
80 *
|
Chris@0
|
81 * @return string
|
Chris@0
|
82 */
|
Chris@0
|
83 public function __toString()
|
Chris@0
|
84 {
|
Chris@0
|
85 if (null === $this->string) {
|
Chris@0
|
86 $this->string = implode(', ', array_map(function ($token) {
|
Chris@0
|
87 return (string) $token;
|
Chris@0
|
88 }, $this->tokens));
|
Chris@0
|
89 }
|
Chris@0
|
90
|
Chris@0
|
91 return $this->string;
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * @return array
|
Chris@0
|
96 */
|
Chris@0
|
97 public function getTokens()
|
Chris@0
|
98 {
|
Chris@0
|
99 return $this->tokens;
|
Chris@0
|
100 }
|
Chris@0
|
101 }
|