/** * @param mixed $valueToCheck * @param int $valueVariableType * @param array $functions * @param mixed $parsedValue * @param int $parsedValueVariableType * * @return Func\Condition * @throws FREST\Exception */ private function checkForFunctions($valueToCheck, $valueVariableType, $functions, &$parsedValue, &$parsedValueVariableType) { $functionUsed = NULL; /** @var Func\Condition $function */ foreach ($functions as $function) { $functionName = $function->getName(); $functionParameters = $function->getParameters(); $functionReplacements = $function->getReplacements(); /** @var Func\FunctionParam $firstParameter */ $firstParameter = $functionParameters[0]; $beginsWithFunctionOpen = substr_compare("{$functionName}(", $valueToCheck, 0, strlen($functionName) + 1, TRUE) === 0; $endsWithFunctionClose = substr($valueToCheck, -1) === ')'; if ($beginsWithFunctionOpen && $endsWithFunctionClose) { $functionUsed = $function; $innerValue = trim(substr($valueToCheck, strlen($functionName) + 1, -1)); if (strlen($innerValue) == 0) { throw new FREST\Exception(FREST\Exception::InvalidValue, "Empty value specified in Func '{$functionName}'"); } if (isset($functionReplacements)) { foreach ($functionReplacements as $old => $new) { $innerValue = str_replace($old, $new, $innerValue); } } $valuesToConcatenate = NULL; $innerValueVariableType = Type\Variable::stricterVariableType($firstParameter->getVariableType(), $valueVariableType); $castedValue = Type\Variable::castValue($innerValue, $innerValueVariableType); if (!isset($castedValue)) { $variableTypeString = Type\Variable::getString($innerValueVariableType); throw new FREST\Exception(FREST\Exception::InvalidType, "Expecting value for Func '{$functionName}' to be of type '{$variableTypeString}' but received '{$innerValue}'"); } $parsedValue = $castedValue; $parsedValueVariableType = $innerValueVariableType; break; // found use of Func already, don't keep checking } } return $functionUsed; }