app = $app; $this->loader = $app->cliLoader(); } public function usage($module = null, $command = null, $action = null) { if ($module) { $module = $this->loader->resolveModuleName($module); return $this->moduleUsage($module, $command, $action); } if ($command) { $command = $this->loader->resolveCommandName($command); return $this->commandUsage($command, $action); } return $this->globalUsage(); } public function globalUsage() { $d = "USAGE: icingacli [module] [action] [options]\n\n" . "Available commands:\n\n"; foreach ($this->loader->listCommands() as $command) { if ($command !== 'autocomplete') { $obj = $this->loader->getCommandInstance($command); $d .= sprintf( " %-14s %s\n", $command, $this->getClassTitle($obj) ); } } $d .= "\nAvailable modules:\n\n"; foreach ($this->loader->listModules() as $module) { $d .= ' ' . $module . "\n"; } $d .= "\nGlobal options:\n\n" . " --verbose Be verbose\n" . " --debug Show debug output\n" . " --help Show help\n" . " --benchmark Show benchmark summary\n" . " --watch [s] Refresh output every seconds (default: 5)\n" ; $d .= "\nShow help on a specific command : icingacli help " . "\nShow help on a specific module : icingacli help " . "\n"; return $d; } public function moduleUsage($module, $command = null, $action = null) { $commands = $this->loader->listModuleCommands($module); if (empty($commands)) { return "The '$module' module does not provide any CLI commands\n"; } $d = ''; if ($command) { $obj = $this->loader->getModuleCommandInstance($module, $command); } if ($command === null) { $d = "USAGE: icingacli $module [] [options]\n\n" . "Available commands:\n\n"; foreach ($commands as $command) { $d .= ' ' . $command . "\n"; } $d .= "\nShow help on a specific command: icingacli help $module \n"; } elseif ($action === null) { $d .= $this->showCommandActions($obj, $command); } else { $action = $this->loader->resolveObjectActionName($obj, $action); $d .= $this->getMethodDocumentation($obj, $action); } return $d; } protected function showCommandActions($command, $name) { $actions = $command->listActions(); $d = $this->getClassDocumentation($command) . "Available actions:\n\n"; foreach ($actions as $action) { $d .= sprintf( " %-14s %s\n", $action, $this->getMethodTitle($command, $action) ); } $d .= "\nShow help on a specific action: icingacli help $name \n"; return $d; } public function commandUsage($command, $action = null) { $obj = $this->loader->getCommandInstance($command); $action = $this->loader->resolveObjectActionName($obj, $action); $d = "\n"; if ($action) { $d .= $this->getMethodDocumentation($obj, $action); } else { $d .= $this->showCommandActions($obj, $command); } return $d; } protected function getClassTitle($class) { $ref = new ReflectionClass($class); $comment = new CommentParser($ref->getDocComment()); return $comment->getTitle(); } protected function getClassDocumentation($class) { $ref = new ReflectionClass($class); $comment = new CommentParser($ref->getDocComment()); return $comment->dump(); } protected function getMethodTitle($class, $method) { $ref = new ReflectionMethod($class, $method . 'Action'); $comment = new CommentParser($ref->getDocComment()); return $comment->getTitle(); } protected function getMethodDocumentation($class, $method) { $ref = new ReflectionMethod($class, $method . 'Action'); $comment = new CommentParser($ref->getDocComment()); return $comment->dump(); } }