php-yaoi/php-yaoi

View on GitHub
src/Cli/Command/Application/Runner.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

namespace Yaoi\Cli\Command\Application;


use Yaoi\Cli\Command\RequestMapper;
use Yaoi\Command;
use Yaoi\Command\Application;
use Yaoi\Io\Request;

class Runner extends \Yaoi\Cli\Command\Runner
{

    /** @var Application */
    protected $command;

    public function __construct(Command $command)
    {
        parent::__construct($command);
    }

    public function run(Request $request = null)
    {
        if (null === $request) {
            $request = Request::createAuto();
        }

        $this->request = $request;

        try {
            if (!$this->command instanceof Application) {
                throw new Command\Exception('Application required', Command\Exception::INVALID_ARGUMENT);
            }

            $this->reader = new RequestMapper();
            $this->reader->read($request, $this->command->optionsArray());
        } catch (Command\Exception $exception) {
            if (empty($this->reader->values['action'])) { // TODO symbolize 'action' literal
                $this->response->error($exception->getMessage());
                $this->response->addContent('Use --help to show information.');
                return $this;
            }
        }

        foreach ($this->reader->values as $name => $value) {
            $this->command->$name = $value;
        }


        if (isset($this->command->action)) {
            $action = $this->command->action;
            $commandDefinition = $this->command->definition()->actions[$action];
            $command = new $commandDefinition->commandClass;

            $runner = new \Yaoi\Cli\Command\Runner($command);
            $runner->commandName = $this->commandName . ' ' . $action;
            $runner->commandVersion = $this->commandVersion;
            $runner->commandDescription = $this->commandDescription
                . ($runner->commandDescription ? PHP_EOL . $runner->commandDescription : '');
            $runner->skipFirstTokens = 1;
            $runner->run($request);
        } elseif (!empty($this->reader->values[self::HELP])) {
            $this->showHelp();
        } elseif (!empty($this->reader->values[self::VERSION])) {
            $this->showVersion();
        } elseif (!empty($this->reader->values[self::BASH_COMPLETION])) {
            $this->showBashCompletion();
        } // @codeCoverageIgnoreStart
        elseif (!empty($this->reader->values[self::INSTALL])) {
            $this->install();
        }
        // @codeCoverageIgnoreEnd

        return $this;
    }


    public function showBashCompletion()
    {
        $completion = new Completion($this->command);
        $completion->render();
    }


}