El tipo atom de Elixir representa una constante fija. El valor de un átomo es simplemente su propio nombre. Esto nos da una forma segura en cuanto a tipos de interactuar con los datos. Los átomos se pueden definir de la siguiente manera:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
Los átomos se representan internamente mediante un número entero en una tabla de búsqueda, que se establece automáticamente. No es posible cambiar este valor interno.
A menudo queremos escribir código que pueda ramificarse según una condición. Aunque hay muchas formas de hacer esto en Elixir, una de las más sencillas es usar cond/1.
En su forma más simple, cond sigue el primer camino que se evalúa como true, con una o más ramas:
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 ningún camino se evalúa como true, el entorno de ejecución lanza un error.
Estás ejecutando un sistema que consta de unas cuantas aplicaciones que producen muchos logs. Quieres escribir un pequeño programa que agrupe esos logs y les asigne etiquetas según su nivel de gravedad. Todas las aplicaciones de tu sistema usan los mismos códigos de log, pero algunas de las aplicaciones heredadas no admiten todos los códigos.
| Log code | Log label | Supported in legacy apps? |
|---|---|---|
| 0 | trace | no |
| 1 | debug | sí |
| 2 | info | sí |
| 3 | warning | sí |
| 4 | error | sí |
| 5 | fatal | no |
| other / not supported | unknown | - |
Implementa la función LogLevel.to_label/2. Debe recibir un código entero y un valor de tipo Boolean que te indica si el log proviene de una aplicación heredada, y devolver la etiqueta de una línea de log como un átomo.
Los códigos de log que no se especifican en la tabla deben devolver la etiqueta unknown. Los códigos de log que la tabla indica como no compatibles con las aplicaciones heredadas también deben devolver la etiqueta unknown si el log proviene de una aplicación heredada.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
Hay que notificar a alguien cuando ocurren cosas inesperadas.
Implementa la función LogLevel.alert_recipient/2 para determinar a quién se debe enviar la alerta. La función debe recibir un código entero y un valor de tipo Boolean que te indica si el log proviene de una aplicación heredada, y devolver el nombre del destinatario como un átomo.
Usa la función LogLevel.to_label/2 de la tarea anterior. Si la etiqueta del log es error o fatal, envía la alerta al equipo ops. Si recibes un log con la etiqueta unknown de un sistema heredado, envía la alerta al equipo dev1; las demás etiquetas unknown deben enviarse al equipo dev2. Todas las demás etiquetas de log se pueden ignorar sin problema devolviendo false.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.