158 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\b\ui;
 | |
| 
 | |
| use nur\b\params\IParametrable;
 | |
| use Throwable;
 | |
| 
 | |
| /**
 | |
|  * Interface IMessenger: interface pour un objet qui centralise des informations
 | |
|  * à afficher à l'utilisateur et/ou à logguer dans un fichier
 | |
|  */
 | |
| interface IMessenger extends IParametrable {
 | |
|   # Types et destination de messages
 | |
|   const TYPE_MASK = 0b11;
 | |
|   const TYPE_ERROR = 3, TYPE_WARNING = 2, TYPE_INFO = 1, TYPE_DEBUG = 0;
 | |
|   const RESULT_MASK = 0b1100;
 | |
|   const RESULT_FAILURE = 3 << 2, RESULT_SUCCESS = 2 << 2, RESULT_NEUTRAL = 1 << 2, RESULT_NONE = 0 << 2;
 | |
|   const DEST_MASK = 0b110000;
 | |
|   const DEST_LOG = 2 << 4, DEST_DISPLAY = 1 << 4, DEST_ALL = self::DEST_DISPLAY + self::DEST_LOG;
 | |
| 
 | |
|   # Niveaux de messages
 | |
|   const LEVEL_NEVER = PHP_INT_MAX;
 | |
|   const LEVEL_CRITICAL = 100, LEVEL_MAJOR = 90, LEVEL_NORMAL = 30, LEVEL_MINOR = 0;
 | |
|   const LEVEL_ALWAYS = PHP_INT_MIN;
 | |
| 
 | |
|   # Composantes d'un message
 | |
|   const KEY_USER = "user", KEY_TECH = "tech", KEY_EXCEPTION = "exception";
 | |
| 
 | |
|   const LEVELS_SCHEMA = [
 | |
|     self::KEY_USER => [null, null, "niveau minimum pour afficher des messages utilisateurs"],
 | |
|     self::KEY_TECH => [null, null, "niveau minimum pour afficher des messages techniques"],
 | |
|     self::KEY_EXCEPTION => [null, null, "niveau minimum pour afficher les traces d'exception"],
 | |
|   ];
 | |
| 
 | |
|   /**
 | |
|    * spécifier les niveaux minimum pour que soient affichés les messages de type
 | |
|    * user, tech et exception.
 | |
|    *
 | |
|    * $levels doit être conforme au schéma {@link LEVELS_SCHEMA}.
 | |
|    * chaque valeur peut être un niveau numérique ou un tableau de la forme
 | |
|    * [$default_level, $profile => $level, ...]
 | |
|    */
 | |
|   function setLevels(?array $printLevels, ?array $logLevels=null, $typeLevels=null): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * démarrer une nouvelle section dans laquelle ajouter des messages. si une
 | |
|    * section est en cours, la terminer d'abord (il n'est pas prévu de pouvoir
 | |
|    * imbriquer des sections)
 | |
|    *
 | |
|    * @param int|null $msgType le type des messages de cette section. c'est une
 | |
|    * information qui peut être utilisée pour mettre en forme la section
 | |
|    * @param int|null $msgLevel le niveau maximum des messages de cette section.
 | |
|    * c'est une information heuristique pour voir si la section sera affichée ou
 | |
|    * non. si $level===null, la section est toujours affichée
 | |
|    */
 | |
|   function startSection($title, ?int $msgType=null, ?int $msgLevel=null): IMessenger;
 | |
| 
 | |
|   /** retourner true si on est actuellement dans une section */
 | |
|   function isInSection(): bool;
 | |
| 
 | |
|   /** terminer explicitement la section démarrée par {@link startSection()} */
 | |
|   function endSection(): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * démarrer un nouveau groupe de messages. contrairement aux sections, les
 | |
|    * groupes peuvent être imbriqués. $count indique le nombre de messages prévus
 | |
|    * dans ce groupe, ou null, si le nombre est inconnu. l'implémentation peut
 | |
|    * choisir d'afficher un groupe différemment en fonction du nombre de ses
 | |
|    * messages
 | |
|    *
 | |
|    * @param int|null $msgType le type des messages de ce groupe. c'est une
 | |
|    * information qui peut être utilisée pour mettre en forme le groupe
 | |
|    * @param int|null $msgLevel le niveau maximum des messages de ce groupe.
 | |
|    * c'est une information heuristique pour voir si le groupe sera affiché ou
 | |
|    * non. si $level===null, le groupe est toujours affiché
 | |
|    */
 | |
|   function startGroup($prefix, ?int $count=null, ?int $msgType=null, ?int $msgLevel=null): IMessenger;
 | |
| 
 | |
|   /** retourner true si on est actuellement dans un groupe */
 | |
|   function isInGroup(): bool;
 | |
| 
 | |
|   /** terminer le groupe démarré par {@link startGroup()} */
 | |
|   function endGroup(): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * terminer le groupe ou la section en cours, le cas échéant. si $all==true
 | |
|    * alors terminer tous les groupes en cours, puis terminer le section courante
 | |
|    */
 | |
|   function end(bool $all=false): IMessenger;
 | |
| 
 | |
|   const MESSAGE_SCHEMA = [
 | |
|     self::KEY_USER => [null, null, "message à afficher à l'utilisateur",
 | |
|       # il peut s'agir d'une chaine ou d'une instance de Exception
 | |
|     ],
 | |
|     self::KEY_TECH => [null, null, "message technique consultable par l'utilisateur",
 | |
|       # il peut s'agir d'une chaine ou d'une instance de Exception
 | |
|     ],
 | |
|     self::KEY_EXCEPTION => [null, null, "instance de Exception qui a provoqué ce message"],
 | |
|   ];
 | |
| 
 | |
|   # options dépendantes de l'implémentation
 | |
|   const MESSAGE_OPTIONS_SCHEMA = [];
 | |
| 
 | |
|   /** normaliser $message pour qu'il soit conforme au schéma */
 | |
|   function ensureMessage(&$message): void;
 | |
| 
 | |
|   /**
 | |
|    * ajouter un message de type $type et de niveau $level. le message n'est pris
 | |
|    * en compte que si les niveaux sont suffisants.
 | |
|    *
 | |
|    * C'est à l'implémentation de décider si le message sera affiché de suite ou
 | |
|    * à la fin du groupe ou de la section.
 | |
|    *
 | |
|    * @param array|string|Throwable $message le message à afficher, conforme à
 | |
|    * {@link MESSAGE_SCHEMA} et {@link MESSAGE_OPTIONS_SCHEMA}
 | |
|    * @param int $type le type de message
 | |
|    * @param int $level le niveau du message
 | |
|    */
 | |
|   function addMessage($message, int $type, int $level): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance pour démarrer un groupe d'un seul message, puis, si
 | |
|    * le résultat est fourni, le terminer avec le résultat spécifié.
 | |
|    */
 | |
|   function action($message, $result=null, ?array $args=null, ?int $type=null, ?int $level=null): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance qui termine le groupe courant avec le résultat
 | |
|    * spécifié
 | |
|    *
 | |
|    * - result peut être booléen: true pour succès, false pour échec
 | |
|    * - si c'est une chaine de caractère, alors c'est un succès
 | |
|    * - si c'est une exception, alors c'est un échec
 | |
|    * - si un callable, alors la fonction est appelée avec les arguments $args et
 | |
|    * le résultat est évalué selon les règles précédentes
 | |
|    *
 | |
|    * $type n'est utilisé que pour spécifier la destination le cas échéant
 | |
|    */
 | |
|   function aresult($result, ?array $args=null, $message=null, ?int $type=null): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance qui appelle
 | |
|    *   aresult(true, null, $message, $type + NEUTRAL);
 | |
|    */
 | |
|   function astep($message=null, ?int $type=null): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance qui appelle
 | |
|    *   aresult(true, null, $message, $type);
 | |
|    */
 | |
|   function asuccess($message=null, ?int $type=null): IMessenger;
 | |
| 
 | |
|   /**
 | |
|    * méthode de convenance qui appelle
 | |
|    *     aresult(false, null, [...$message, "exception" => $e], $type);
 | |
|    */
 | |
|   function afailure($message=null, ?Throwable $e=null, ?int $type=null): IMessenger;
 | |
| }
 |