73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			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();
 | 
						|
}
 |