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.
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.
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.
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.
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.
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.
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.