private function parseOptionSequence()
 {
     $tokens = $this->tokens->pop()->getValue();
     for ($i = 0; $i < strlen($tokens); ++$i) {
         if (!($definition = $this->globalDefinitionRepository->find($tokens[$i]))) {
             $definition = new OptionDefinition($tokens[$i], null, null, 'bool');
         }
         $this->addOption($definition);
     }
 }
Example #2
0
 /**
  * @test
  */
 public function option_definitions_can_all_be_added_at_once()
 {
     $optionRepository = new OptionDefinitionRepository();
     $optionRepository->add(new OptionDefinition('h', 'help', null, OptionDefinition::TYPE_BOOL));
     $optionRepository->add(new OptionDefinition('e', 'environment', null, OptionDefinition::TYPE_VALUE));
     $result = usage('[options]', '-h --environment=development', $optionRepository);
     $this->assertInternalType('array', $result);
     $this->assertEquals(2, count($result));
     $this->assertEquals("option('h', 'true')", $result[0]);
     $this->assertEquals("option('environment', 'development')", $result[1]);
 }
 public function createFrom($symbols, OptionDefinitionRepository $definitionRepository)
 {
     $options = [];
     $positional = [];
     for ($i = 0, $max = count($symbols); $i < $max; ++$i) {
         $symbol = $symbols[$i];
         if (empty($symbol)) {
             continue;
         }
         // Command or Argument
         if ($symbol[0] != '-') {
             $positional[] = $symbol;
             continue;
         }
         $size = strlen($symbol);
         // Single Dash
         if ($size == 1) {
             $positional[] = $symbol;
             continue;
         }
         // Double Dash
         if ($size == 2 && $symbol[1] == '-') {
             $positional[] = $symbol;
             continue;
         }
         // Long Option
         if ($symbol[1] == '-') {
             $parts = explode('=', substr($symbol, 2), 2);
             $name = $parts[0];
             $definition = $definitionRepository->find($name);
             if (!$definition) {
                 return null;
             }
             switch ($definition->getType()) {
                 case OptionDefinition::TYPE_BOOL:
                     $options[$definition->getLabel()][] = new Option($name, $definition, true);
                     break;
                 case OptionDefinition::TYPE_VALUE:
                     $value = isset($parts[1]) ? $parts[1] : $symbols[++$i];
                     $options[$definition->getLabel()][] = new Option($name, $definition, $value);
                     break;
             }
             continue;
         }
         // Short Options
         $shortOptions = substr($symbol, 1);
         while (!empty($shortOptions)) {
             $name = $shortOptions[0];
             $shortOptions = substr($shortOptions, 1);
             $definition = $definitionRepository->find($name);
             if (!$definition) {
                 return null;
             }
             switch ($definition->getType()) {
                 case OptionDefinition::TYPE_BOOL:
                     $options[$definition->getLabel()][] = new Option($name, $definition, true);
                     break;
                 case OptionDefinition::TYPE_VALUE:
                     $value = null;
                     if (!empty($shortOptions)) {
                         $value = $shortOptions[0] == '=' ? substr($shortOptions, 1) : $shortOptions;
                         $shortOptions = '';
                     }
                     if ($value === null) {
                         $value = $symbols[++$i];
                     }
                     $options[$definition->getLabel()][] = new Option($name, $definition, $value);
                     break;
             }
         }
     }
     $positional = array_reverse($positional);
     foreach ($options as &$optionGroup) {
         $optionGroup = array_reverse($optionGroup);
     }
     return new InputSequence($options, $positional);
 }
Example #4
0
 private function processArgs(OptionDefinitionRepository $optionRepository)
 {
     /** @var OptionDefinition $optionDefinition */
     foreach ($optionRepository as $optionDefinition) {
         $this->options[$optionDefinition->getLongName() ?: $optionDefinition->getShortName()] = null;
     }
     foreach ($this->args as $arg) {
         switch (true) {
             case $arg instanceof Command:
                 $this->command[] = $arg->getName();
                 break;
             case $arg instanceof Argument:
                 $this->arguments[$arg->getName()][] = $arg->getValue();
                 break;
             case $arg instanceof Option:
                 $this->options[$this->getOptionName($arg)][] = $arg->getValue();
                 break;
         }
     }
     foreach ($this->options as $key => $value) {
         if ($value === null) {
             $this->options[$key] = [$optionRepository->find($key)->getDefault()];
         }
     }
 }