getCommands() as $c) echo " $c\n"; exit(is_null($error) ? 0 : 1); } function getCommands(): array { if (is_null($this->commandsCache)) { $funcs = array_filter(get_defined_functions()['user'], fn(string $f) => str_starts_with($f, $this->ns)); $funcs = array_map(fn(string $f) => str_replace('_', '-', substr($f, strlen($this->ns.'\\'))), $funcs); $this->commandsCache = array_values($funcs); } return $this->commandsCache; } function run(): void { global $argv, $argc; if (!is_cli()) cli::die('SAPI != cli'); if ($argc < 2) $this->usage(); $func = $argv[1]; if (!in_array($func, $this->getCommands())) self::usage('unknown command "'.$func.'"'); $func = str_replace('-', '_', $func); call_user_func($this->ns.'\\'.$func); } public static function input(string $prompt): string { echo $prompt; $input = substr(fgets(STDIN), 0, -1); return $input; } public static function silentInput(string $prompt = ''): string { echo $prompt; system('stty -echo'); $input = substr(fgets(STDIN), 0, -1); system('stty echo'); echo "\n"; return $input; } public static function die($error): void { self::error($error); exit(1); } public static function error($error): void { fwrite(STDERR, "error: {$error}\n"); } }