nur-sery/wip/cli/Application.php

73 lines
1.8 KiB
PHP

<?php
namespace nur\sery\wip\cli;
use Exception;
use nur\sery\ExitError;
use nur\sery\output\msg;
use nur\sery\output\std\StdMessenger;
/**
* Class Application: une application en ligne de commande
*/
abstract class Application {
protected static function _app_init(): void {
msg::set_messenger_class(StdMessenger::class);
}
protected static function _app_configure(Application $app): void {
$app->parseArgs();
}
protected static function _app_main(Application $app): void {
$retcode = $app->main();
if (is_int($retcode)) exit($retcode);
elseif (is_bool($retcode)) exit($retcode? 0: 1);
elseif ($retcode !== null) exit(strval($retcode));
}
static function run(?Application $app=null): void {
try {
static::_app_init();
if ($app === null) $app = new static();
static::_app_configure($app);
static::_app_main($app);
} catch (ExitError $e) {
msg::error($e->getUserMessage());
exit($e->getCode());
} catch (Exception $e) {
msg::error($e);
exit(1);
}
}
/**
* sortir de l'application avec un code d'erreur, qui est 0 par défaut (i.e
* pas d'erreur)
*
* équivalent à lancer l'exception {@link ExitError}
*/
protected static final function exit(int $exitcode=0, $message=null) {
throw new ExitError($exitcode, $message);
}
/**
* sortir de l'application avec un code d'erreur, qui vaut 1 par défaut (i.e
* une erreur s'est produite)
*
* équivalent à lancer l'exception {@link ExitError}
*/
protected static final function die($message=null, int $exitcode=1) {
throw new ExitError($exitcode, $message);
}
const ARGS = [];
/** @throws ArgsException */
function parseArgs(array $args=null): void {
$parser = new ArgsParser(static::ARGS);
$parser->parse($this, $args);
}
abstract function main();
}