Percursos
/
Elixir
Elixir
/
Exercícios
/
Nível de registo
Nível de registo

Nível de registo

Exercício de aprendizagem

Introdução

Átomos

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.

Cond

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.

Instruções

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 -

1. Determinar o rótulo de log

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

2. Enviar um alerta

É 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
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Nível de registo?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.