Le type atom d'Elixir représente une constante fixe. La valeur d'un atome est simplement son propre nom. Cela nous permet d'interagir avec les données de manière sûre du point de vue des types. Les atomes peuvent être définis comme suit :
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
Les atomes sont représentés en interne par un entier dans une table de correspondance, renseignée automatiquement. Il n'est pas possible de modifier cette valeur interne.
Souvent, on veut écrire du code qui peut prendre différentes branches selon une condition. Même s'il existe de nombreuses façons de faire cela en Elixir, l'une des plus simples consiste à utiliser cond/1.
Dans sa forme la plus simple, cond suit le premier chemin qui s'évalue à true, parmi une ou plusieurs branches :
cond do
x > 10 -> :this_might_be_the_way
y < 7 -> :or_that_might_be_the_way
true -> :this_is_the_default_way
end
Si aucun chemin ne s'évalue à true, une erreur est levée par l'environnement d'exécution.
Tu administres un système composé de quelques applications qui produisent de nombreux logs. Tu veux écrire un petit programme qui va regrouper ces logs et leur attribuer des étiquettes en fonction de leur niveau de gravité. Toutes les applications du système utilisent les mêmes codes de log, mais certaines applications historiques ne prennent pas en charge tous les codes.
| Code de log | Étiquette de log | Pris en charge dans les applications historiques ? |
|---|---|---|
| 0 | trace | non |
| 1 | debug | oui |
| 2 | info | oui |
| 3 | warning | oui |
| 4 | error | oui |
| 5 | fatal | non |
| autre / non pris en charge | unknown | - |
Implémente la fonction LogLevel.to_label/2. Elle doit prendre un code entier et un booléen qui indique si le log provient d'une application historique, et renvoyer l'étiquette d'une ligne de log sous forme d'atome.
Les codes de log qui ne figurent pas dans le tableau doivent renvoyer une étiquette unknown. Les codes de log indiqués dans le tableau comme non pris en charge dans les applications historiques doivent eux aussi renvoyer une étiquette unknown si le log provient d'une application historique.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
Il faut bien prévenir quelqu'un quand des choses inattendues se produisent.
Implémente la fonction LogLevel.alert_recipient/2 pour déterminer à qui l'alerte doit être envoyée. Elle doit prendre un code entier et un booléen qui indique si le log provient d'une application historique, et renvoyer le nom du destinataire sous forme d'atome.
Utilise la fonction LogLevel.to_label/2 de la tâche précédente. Si l'étiquette du log est error ou fatal, envoie l'alerte à l'équipe ops. Si tu reçois un log avec une étiquette unknown provenant d'un système historique, envoie l'alerte à l'équipe dev1 ; les autres étiquettes inconnues doivent être envoyées à l'équipe dev2. Toutes les autres étiquettes de log peuvent être ignorées sans risque en renvoyant false.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.