새 여권

새 여권

학습 연습 문제

소개

With

Elixir의 특수 형식 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와 현재 시각에서 15분 뒤를 가리키는 NaiveDateTime이 담긴 튜플을 반환해요. 앞에서처럼 :error 튜플을 받으면 그대로 반환해요.

3. 창구로 가서 신청서에 도장 받기

왠일인지 창구마다 요구하는 신청서 색이 달라요. 물론 웹사이트에서 가장 먼저 찾은 걸 출력했으니, 해피 패스에 집중하며 잘 되기를 바라요.

stamp_form/3 함수를 입구에서 받은 타임스탬프, 창구, 그리고 가져온 신청서(get_new_passport/3의 마지막 인자)와 함께 호출해요. :ok와, 여권 번호를 확인하는 데 사용될 체크섬이 담긴 튜플을 받거나 :error와 메시지가 담긴 튜플을 받게 돼요. 해피 패스에서는 체크섬이 담긴 :ok 튜플을 반환하게 해요. :error 튜플을 받으면 그대로 반환해요.

4. 새 여권 받기

드디어 필요한 서류를 모두 갖췄어요.

앞서 받은 타임스탬프, 창구, 체크섬과 함께 get_new_passport_number/3을 호출해요. 최종 여권 번호가 담긴 문자열을 받게 돼요. 이제 남은 일은 그 문자열을 :ok와 함께 튜플로 반환하고 집으로 가는 것뿐이에요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Elixir Exercism

새 여권 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.