/** * @param State $commandState * @return Expression * @todo add verbosity on missing command in app tree */ public function makeAnchor(State $commandState) { $commandClass = $commandState->commandClass; $commandClasses = array(); if ($commandClass !== $this->definition->commandClass) { while (isset($this->definitionTree[$commandClass])) { $commandClass = $this->definitionTree[$commandClass]; $commandClasses[] = $commandClass; // TODO rename $commandClass as it is a structure $commandClass = $commandClass[0]; } } $properties = array(); for ($i = count($commandClasses) - 1; $i >= 0; --$i) { /** @var Command|string $commandClass */ list($commandClass, $optionName, $enumName) = $commandClasses[$i]; $optionsArray = $commandClass::definition()->optionsArray(); if (isset($this->requestStates[$commandClass])) { $commandStateArray = $this->requestStates[$commandClass]->export(); } else { $commandStateArray = null; } if ($commandStateArray) { foreach ($commandStateArray as $name => $value) { if (!isset($optionsArray[$name])) { continue; } if ($name === $optionName) { $properties[] = array($optionsArray[$name], $enumName); } else { $properties[] = array($optionsArray[$name], $value); } } } else { if (isset($optionsArray[$optionName])) { $properties[] = array($optionsArray[$optionName], $enumName); } } } $commandClass = $commandState->commandClass; $optionsArray = $commandClass::definition()->optionsArray(); foreach ($commandState->export() as $name => $value) { if (!isset($optionsArray[$name])) { continue; } $properties[] = array($optionsArray[$name], $value); } return $this->requestMapper->makeAnchor($properties); }