La forma especial with proporciona una manera de centrarse en el «camino feliz» de una serie de pasos que pueden fallar y de ocuparse de los fallos más tarde.
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
En cada paso, si una cláusula coincide, la cadena continuará hasta que se ejecute el bloque do. Si una coincidencia falla, la cadena se detiene y se devuelve la cláusula que no coincide. Tienes la opción de usar un bloque else para capturar las coincidencias fallidas y modificar el valor devuelto.
Tu pasaporte está a punto de caducar, así que tienes que pasarte por la oficina de la ciudad para renovarlo. Sabes por experiencia que la oficina de tu ciudad no es necesariamente la más fácil de tratar, así que decides hacer lo posible por «centrarte siempre en el camino feliz».
Imprimes el formulario que necesitas para obtener tu nuevo pasaporte, lo rellenas, te subes al coche, das una vuelta a la manzana, aparcas y te diriges a la oficina.
Todas las tareas siguientes requerirán implementar y ampliar get_new_passport/3.
Resulta que el edificio solo abre por la tarde, y no a la misma hora todos los días.
Llama a la función enter_building/1 con la hora actual (que recibes como primer argumento de get_new_passport/3). Si el edificio está abierto, la función devolverá una tupla con :ok y una marca de tiempo que necesitarás más adelante; en caso contrario, una tupla con :error y un mensaje. Por ahora, el camino feliz puede devolver la tupla :ok.
Si recibes una tupla :error, usa el bloque else para devolverla.
El mostrador de información es famoso por sus largas pausas para el café. Si tienes la suerte de encontrar a alguien allí, te dará un manual de instrucciones que explica a qué ventanilla tienes que ir según tu fecha de nacimiento.
Llama a la función find_counter_information/1 con la hora actual. Recibirás una tupla con :ok y un manual, representado por una función anónima, o bien una tupla con :coffee_break y más instrucciones. En tu camino feliz, en el que recibes el manual, aplícalo a tu fecha de nacimiento (segundo argumento de get_new_passport/3). Devolverá el número de la ventanilla a la que tienes que ir. Devuelve una tupla :ok con ese número de ventanilla.
Si recibes un mensaje :coffee_break, devuelve una tupla con :retry y un NaiveDateTime que apunte a 15 minutos después de la hora actual. Como antes, si recibes una tupla :error, devuélvela.
Por algún motivo, las distintas ventanillas requieren formularios de colores diferentes. Como es lógico, imprimiste el primero que encontraste en la web, así que te centras en tu camino feliz y esperas que haya suerte.
Llama a la función stamp_form/3 con la marca de tiempo que recibiste en la entrada, la ventanilla y el formulario que llevaste (último argumento de get_new_passport/3). Recibirás una tupla con :ok y una suma de comprobación que se usará para verificar tu número de pasaporte, o bien una tupla con :error y un mensaje. Haz que tu camino feliz devuelva una tupla :ok con la suma de comprobación. Si recibes una tupla :error, devuélvela.
Por fin tienes todos los documentos que necesitas.
Llama a get_new_passport_number/3 con la marca de tiempo, la ventanilla y la suma de comprobación que recibiste antes. Recibirás un string con tu número de pasaporte definitivo; lo único que queda por hacer es devolver ese string en una tupla con :ok y volver a casa.
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.