O tipo atom do Elixir representa uma constante fixa. O valor de um átomo é simplesmente o seu próprio nome. Isto dá-nos uma forma segura, do ponto de vista dos tipos, de interagir com dados. Os átomos podem ser definidos da seguinte forma:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
Internamente, cada átomo é representado por um número inteiro numa tabela de consulta, atribuído automaticamente. Não é possível alterar esse valor interno.
Muitas vezes queremos escrever código que possa ramificar com base numa condição. Embora haja muitas formas de o fazer em Elixir, uma das mais simples é usar o cond/1.
Na sua forma mais simples, o cond segue o primeiro de um ou mais ramos que seja avaliado como true:
cond do
x > 10 -> :this_might_be_the_way
y < 7 -> :or_that_might_be_the_way
true -> :this_is_the_default_way
end
Se nenhum caminho for avaliado como true, o ambiente de execução lança um erro.
Estás a gerir um sistema que consiste em algumas aplicações que produzem muitos logs. Queres escrever um pequeno programa que agregue esses logs e lhes atribua rótulos de acordo com o seu nível de gravidade. Todas as aplicações no teu sistema usam os mesmos códigos de log, mas algumas das aplicações legacy não suportam todos os códigos.
| Código de log | Rótulo de log | Suportado em aplicações legacy? |
|---|---|---|
| 0 | trace | não |
| 1 | debug | sim |
| 2 | info | sim |
| 3 | warning | sim |
| 4 | error | sim |
| 5 | fatal | não |
| outro / não suportado | unknown | - |
Implementa a função LogLevel.to_label/2. Deve receber um código inteiro e um sinalizador booleano que te indica se o log vem de uma aplicação legacy, e devolver o rótulo de uma linha de log como um átomo.
Os códigos de log não especificados na tabela devem devolver um rótulo unknown. Os códigos de log especificados na tabela como não suportados em aplicações legacy também devem devolver um rótulo unknown se o log vier de uma aplicação legacy.
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
É preciso notificar alguém quando acontecem coisas inesperadas.
Implementa a função LogLevel.alert_recipient/2 para determinar a quem o alerta deve ser enviado. A função deve receber um código inteiro e um sinalizador booleano que te indica se o log vem de uma aplicação legacy, e devolver o nome do destinatário como um átomo.
Usa a função LogLevel.to_label/2 da tarefa anterior. Se o rótulo do log for error ou fatal, envia o alerta para a equipa de ops. Se receberes um log com um rótulo unknown de um sistema legacy, envia o alerta para a equipa dev1, outros rótulos unknown devem ser enviados para a equipa dev2. Todos os outros rótulos de log podem ser ignorados em segurança devolvendo false.
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.