La forme spéciale with permet de se concentrer sur le happy path d'une série d'étapes susceptibles d'échouer, et de gérer les échecs plus tard.
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
À chaque étape, si une clause correspond, la chaîne se poursuit jusqu'à ce que le bloc do soit exécuté. Si une correspondance échoue, la chaîne s'arrête et la clause qui ne correspond pas est renvoyée. Tu peux aussi utiliser un bloc else pour intercepter les correspondances qui échouent et modifier la valeur de retour.
Ton passeport arrive bientôt à expiration, tu dois donc passer au bureau municipal pour le renouveler. Tu sais par expérience que ton bureau municipal n'est pas forcément commode, alors tu décides de faire de ton mieux pour toujours « se concentrer sur le happy path ».
Tu imprimes le formulaire dont tu as besoin pour obtenir ton nouveau passeport, tu le remplis, tu montes dans ta voiture, tu fais le tour du pâté de maisons, tu te gares et tu te diriges vers le bureau.
Pour toutes les tâches suivantes, il faudra implémenter et étendre get_new_passport/3.
Il se trouve que le bâtiment n'est ouvert que l'après-midi, et pas à la même heure tous les jours.
Appelle la fonction enter_building/1 avec l'heure actuelle (qui t'est donnée comme premier argument de get_new_passport/3). Si le bâtiment est ouvert, la fonction renvoie un tuple avec :ok et un horodatage dont tu auras besoin plus tard, sinon un tuple avec :error et un message. Pour l'instant, le happy path peut renvoyer le tuple :ok.
Si tu obtiens un tuple :error, utilise le bloc else pour le renvoyer.
L'accueil a la réputation de prendre de longues pauses café. Si tu as la chance d'y trouver quelqu'un, il te donnera un manuel d'instructions qui explique à quel guichet tu dois te rendre en fonction de ta date de naissance.
Appelle la fonction find_counter_information/1 avec l'heure actuelle. Tu obtiendras soit un tuple avec :ok et un manuel, représenté par une fonction anonyme, soit un tuple avec :coffee_break et d'autres instructions. Dans ton happy path où tu reçois le manuel, applique-le à ta date de naissance (deuxième argument de get_new_passport/3). Il renverra le numéro du guichet où tu dois te rendre. Renvoie un tuple :ok avec ce numéro de guichet.
Si tu reçois un message :coffee_break, renvoie un tuple avec :retry et un NaiveDateTime qui pointe vers 15 minutes après l'heure actuelle. Comme précédemment, si tu obtiens un tuple :error, renvoie-le.
Pour une raison quelconque, les différents guichets exigent des formulaires de couleurs différentes. Bien sûr, tu as imprimé le premier que tu as trouvé sur le site web, alors tu te concentres sur ton happy path et tu espères que tout ira bien.
Appelle la fonction stamp_form/3 avec l'horodatage que tu as reçu à l'entrée, le guichet et le formulaire que tu as apporté (dernier argument de get_new_passport/3). Tu obtiendras soit un tuple avec :ok et une somme de contrôle qui servira à vérifier ton numéro de passeport, soit un tuple avec :error et un message. Fais en sorte que ton happy path renvoie un tuple :ok avec la somme de contrôle. Si tu obtiens un tuple :error, renvoie-le.
Enfin, tu as tous les documents dont tu as besoin.
Appelle get_new_passport_number/3 avec l'horodatage, le guichet et la somme de contrôle que tu as reçus plus tôt. Tu recevras une string contenant ton numéro de passeport définitif ; tout ce qu'il reste à faire, c'est de renvoyer cette string dans un tuple avec :ok et de rentrer chez toi.
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.