Trilhas
/
Elixir
Elixir
/
Exercícios
/
Novo passaporte
Novo passaporte

Novo passaporte

Exercício de aprendizagem

Introdução

With

A forma especial with oferece uma maneira de focar no "caminho feliz" de uma série de etapas que podem falhar e lidar com as falhas depois.

with {:ok, id} <- get_id(username),
     {:ok, avatar} <- fetch_avatar(id),
     {:ok, image_type} <- check_valid_image_type(avatar) do
  {:ok, image_type, avatar}
else
  :not_found ->
    {:error, "invalid username"}

  {:error, "not an image"} ->
    {:error, "avatar associated to #{username} is not an image"}

  err ->
    err
end

Em cada etapa, se uma cláusula casar, a cadeia continua até o bloco do ser executado. Se um casamento falhar, a cadeia para e a cláusula que não casou é retornada. Você tem a opção de usar um bloco else para capturar casamentos que falharam e modificar o valor de retorno.

Instruções

Seu passaporte está prestes a vencer, então você precisa dar uma passada no escritório da cidade para renová-lo. Você sabe, por experiência própria, que o escritório da sua cidade não é necessariamente o mais fácil de lidar, então você decide fazer o possível para sempre "focar no caminho feliz".

Você imprime o formulário de que precisa para obter seu novo passaporte, preenche, entra no carro, dá uma volta no quarteirão, estaciona e segue para o escritório.

Todas as tarefas a seguir vão exigir que você implemente e estenda get_new_passport/3.

1. Entre no prédio

Acontece que o prédio só abre à tarde, e não no mesmo horário todos os dias.

Chame a função enter_building/1 com a hora atual (dada a você como primeiro argumento de get_new_passport/3). Se o prédio estiver aberto, a função vai retornar uma tupla com :ok e um timestamp que você vai precisar mais tarde; caso contrário, uma tupla com :error e uma mensagem. Por enquanto, o caminho feliz pode retornar a tupla :ok.

Se você receber uma tupla com :error, use o bloco else para retorná-la.

2. Vá até o balcão de informações e descubra para qual guichê você deve ir

O balcão de informações é conhecido pelas longas pausas para o café. Se você tiver a sorte de encontrar alguém lá, essa pessoa vai te dar um manual de instruções que explica para qual guichê você precisa ir, dependendo da sua data de nascimento.

Chame a função find_counter_information/1 com a hora atual. Você vai receber uma tupla com :ok e um manual, representado por uma função anônima, ou uma tupla com :coffee_break e mais instruções. No seu caminho feliz, em que você recebe o manual, aplique-o à sua data de nascimento (segundo argumento de get_new_passport/3). Ele vai retornar o número do guichê para onde você precisa ir. Retorne uma tupla :ok com esse número de guichê.

Se você receber uma mensagem :coffee_break, retorne uma tupla com :retry e um NaiveDateTime apontando para 15 minutos depois da hora atual. Como antes, se você receber uma tupla com :error, retorne-a.

3. Vá até o guichê e consiga o carimbo do seu formulário

Por algum motivo, guichês diferentes exigem formulários de cores diferentes. Claro, você imprimiu o primeiro que encontrou no site, então você foca no seu caminho feliz e torce pelo melhor.

Chame a função stamp_form/3 com o timestamp que você recebeu na entrada, o guichê e o formulário que você trouxe (último argumento de get_new_passport/3). Você vai receber uma tupla com :ok e uma soma de verificação que será usada para verificar o número do seu passaporte, ou uma tupla com :error e uma mensagem. Faça seu caminho feliz retornar uma tupla :ok com a soma de verificação. Se você receber uma tupla com :error, retorne-a.

4. Receba seu novo passaporte

Por fim, você tem todos os documentos de que precisa.

Chame get_new_passport_number/3 com o timestamp, o guichê e a soma de verificação que você recebeu antes. Você vai receber uma string com o número final do seu passaporte; tudo o que resta é retornar essa string em uma tupla com :ok e ir para casa.

Editar via GitHub O link abre em uma nova janela ou aba
Elixir Exercism

Tudo pronto para começar Novo passaporte?

Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.