Треки
/
Elixir
Elixir
/
Вправи
/
Новий паспорт
Новий паспорт

Новий паспорт

Навчальна вправа

Вступ

With

Спеціальна форма with дає змогу зосередитися на «щасливому шляху» серії кроків, які можуть зазнати невдачі, а з невдачами розібратися пізніше.

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

На кожному кроці, якщо збігається вираз, ланцюжок продовжиться, доки не виконається блок do. Якщо один збіг не вдається, ланцюжок зупиняється, і повертається вираз, який не збігся. Ми маємо можливість використати блок else, щоб перехопити невдалі збіги та змінити повернене значення.

Вказівки

Наш паспорт скоро протермінується, тож треба завітати до міського управління, щоб поновити його. З попереднього досвіду ми знаємо, що наше міське управління не завжди найлегше в спілкуванні, тож вирішуємо зробити все можливе, щоб завжди триматися «щасливого шляху».

Ми роздруковуємо бланк, потрібний для отримання нового паспорта, заповнюємо його, сідаємо в машину, обʼїжджаємо квартал, паркуємося і вирушаємо до управління.

Усі наступні завдання вимагатимуть реалізації та розширення get_new_passport/3.

1. Заходимо до будівлі

Виявляється, будівля відчинена лише після обіду, і не щодня в один і той самий час.

Викличмо функцію enter_building/1 з поточним часом (нам його передають як перший аргумент get_new_passport/3). Якщо будівля відчинена, функція поверне кортеж із :ok і позначкою часу, яка знадобиться нам пізніше, інакше вона поверне кортеж із :error і повідомленням. Поки що «щасливий шлях» може повертати кортеж :ok.

Якщо отримаємо кортеж :error, скористаймося блоком else, щоб його повернути.

2. Прямуємо до інформаційної стійки й дізнаємося, до якого віконця йти

Інформаційна стійка відома своїми довгими кавовими перервами. Якщо пощастить і там хтось буде, нам дадуть посібник, який пояснить, до якого віконця йти залежно від дати народження.

Викличмо функцію find_counter_information/1 з поточним часом. Ми отримаємо або кортеж із :ok і посібником, поданим як анонімна функція, або кортеж із :coffee_break і додатковими вказівками. На нашому «щасливому шляху», коли ми отримуємо посібник, застосуймо його до дати народження (другий аргумент get_new_passport/3). Він поверне номер віконця, до якого нам треба йти. Повернімо кортеж :ok із цим номером віконця.

Якщо отримаємо повідомлення :coffee_break, повернімо кортеж із :retry і NaiveDateTime, що вказує на 15 хвилин після поточного часу. Як і раніше, якщо отримаємо кортеж :error, повернімо його.

3. Підходимо до віконця і ставимо печатку на бланк

Чомусь різні віконця вимагають бланків різного кольору. Звісно, ми роздрукували перший-ліпший бланк, який знайшли на сайті, тож зосереджуємося на «щасливому шляху» й сподіваємося на краще.

Викличмо функцію stamp_form/3 з позначкою часу, яку ми отримали на вході, номером віконця і бланком, який принесли (останній аргумент get_new_passport/3). Ми отримаємо або кортеж із :ok і контрольною сумою, яку використають для перевірки номера паспорта, або кортеж із :error і повідомленням. Нехай наш «щасливий шлях» поверне кортеж :ok із цією контрольною сумою. Якщо отримаємо кортеж :error, повернімо його.

4. Отримуємо новий паспорт

Нарешті в нас є всі потрібні документи.

Викличмо get_new_passport_number/3 з позначкою часу, номером віконця і контрольною сумою, які ми отримали раніше. Ми отримаємо рядок тексту (англ. string) з остаточним номером паспорта, і залишиться лише повернути цей рядок тексту в кортежі з :ok та піти додому.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

Час розпочати Новий паспорт?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.