Track
/
Elixir
Elixir
/
Esercizi
/
Nuovo passaporto
Nuovo passaporto

Nuovo passaporto

Esercizio di apprendimento

Introduzione

With

La forma speciale with permette di concentrarsi sul «happy path» di una serie di passaggi che potrebbero fallire e di gestire i fallimenti in un secondo momento.

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

A ogni passo, se una clausola corrisponde, la catena continua finché non viene eseguito il blocco do. Se una corrispondenza fallisce, la catena si ferma e viene restituita la clausola che non corrisponde. Hai la possibilità di usare un blocco else per intercettare le corrispondenze fallite e modificare il valore restituito.

Istruzioni

Il tuo passaporto sta per scadere, quindi devi passare dall'ufficio comunale per rinnovarlo. Dalla tua esperienza passata sai che il tuo ufficio comunale non è necessariamente il più facile con cui avere a che fare, così decidi di fare del tuo meglio per «concentrarti sempre sul percorso felice».

Stampi il modulo che ti serve per ottenere il nuovo passaporto, lo compili, salti in macchina, fai il giro dell'isolato, parcheggi e ti dirigi verso l'ufficio.

Tutte le attività che seguono richiederanno di implementare ed estendere get_new_passport/3.

1. Entra nell'edificio

A quanto pare l'edificio è aperto solo di pomeriggio, e non sempre alla stessa ora tutti i giorni.

Chiama la funzione enter_building/1 con l'ora attuale (che ti viene passata come primo argomento di get_new_passport/3). Se l'edificio è aperto, la funzione restituirà una tupla con :ok e un timestamp che ti servirà più avanti, altrimenti una tupla con :error e un messaggio. Per ora, il percorso felice può restituire la tupla :ok.

Se ottieni una tupla :error, usa il blocco else per restituirla.

2. Vai al banco informazioni e scopri a quale sportello devi andare

Il banco informazioni è famoso per le sue lunghe pause caffè. Se sei abbastanza fortunato da trovare qualcuno, ti darà un manuale di istruzioni che spiegherà a quale sportello devi andare in base alla tua data di nascita.

Chiama la funzione find_counter_information/1 con l'ora attuale. Otterrai una tupla con :ok e un manuale, rappresentato da una funzione anonima, oppure una tupla con :coffee_break e ulteriori istruzioni. Nel tuo percorso felice in cui ricevi il manuale, applicalo al tuo compleanno (secondo argomento di get_new_passport/3). Restituirà il numero dello sportello dove devi andare. Restituisci una tupla :ok con quel numero di sportello.

Se ottieni un messaggio :coffee_break, restituisci una tupla con :retry e un NaiveDateTime che punta a 15 minuti dopo l'ora attuale. Come prima, se ottieni una tupla :error, restituiscila.

3. Vai allo sportello e fai timbrare il modulo

Per qualche motivo, sportelli diversi richiedono moduli di colori diversi. Naturalmente hai stampato il primo che hai trovato sul sito, quindi ti concentri sul tuo percorso felice e speri per il meglio.

Chiama la funzione stamp_form/3 con il timestamp che hai ricevuto all'ingresso, lo sportello e il modulo che hai portato (ultimo argomento di get_new_passport/3). Otterrai una tupla con :ok e un checksum che servirà a verificare il tuo numero di passaporto, oppure una tupla con :error e un messaggio. Fai in modo che il tuo percorso felice restituisca una tupla :ok con il checksum. Se ottieni una tupla :error, restituiscila.

4. Ricevi il tuo nuovo passaporto

Finalmente hai tutti i documenti che ti servono.

Chiama get_new_passport_number/3 con il timestamp, lo sportello e il checksum che hai ricevuto in precedenza. Riceverai una stringa con il tuo numero di passaporto definitivo: non ti resta che restituire quella stringa in una tupla con :ok e tornare a casa.

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Nuovo passaporto?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.