Chris@0: Chris@0: * Marcello Duarte Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Prophecy\Argument; Chris@0: Chris@0: /** Chris@0: * Arguments wildcarding. Chris@0: * Chris@0: * @author Konstantin Kudryashov Chris@0: */ Chris@0: class ArgumentsWildcard Chris@0: { Chris@0: /** Chris@0: * @var Token\TokenInterface[] Chris@0: */ Chris@0: private $tokens = array(); Chris@0: private $string; Chris@0: Chris@0: /** Chris@0: * Initializes wildcard. Chris@0: * Chris@0: * @param array $arguments Array of argument tokens or values Chris@0: */ Chris@0: public function __construct(array $arguments) Chris@0: { Chris@0: foreach ($arguments as $argument) { Chris@0: if (!$argument instanceof Token\TokenInterface) { Chris@0: $argument = new Token\ExactValueToken($argument); Chris@0: } Chris@0: Chris@0: $this->tokens[] = $argument; Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Calculates wildcard match score for provided arguments. Chris@0: * Chris@0: * @param array $arguments Chris@0: * Chris@0: * @return false|int False OR integer score (higher - better) Chris@0: */ Chris@0: public function scoreArguments(array $arguments) Chris@0: { Chris@0: if (0 == count($arguments) && 0 == count($this->tokens)) { Chris@0: return 1; Chris@0: } Chris@0: Chris@0: $arguments = array_values($arguments); Chris@0: $totalScore = 0; Chris@0: foreach ($this->tokens as $i => $token) { Chris@0: $argument = isset($arguments[$i]) ? $arguments[$i] : null; Chris@0: if (1 >= $score = $token->scoreArgument($argument)) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: $totalScore += $score; Chris@0: Chris@0: if (true === $token->isLast()) { Chris@0: return $totalScore; Chris@0: } Chris@0: } Chris@0: Chris@0: if (count($arguments) > count($this->tokens)) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return $totalScore; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns string representation for wildcard. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function __toString() Chris@0: { Chris@0: if (null === $this->string) { Chris@0: $this->string = implode(', ', array_map(function ($token) { Chris@0: return (string) $token; Chris@0: }, $this->tokens)); Chris@0: } Chris@0: Chris@0: return $this->string; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return array Chris@0: */ Chris@0: public function getTokens() Chris@0: { Chris@0: return $this->tokens; Chris@0: } Chris@0: }