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을 구현하고 확장해야 해요.
알고 보니 이 건물은 오후에만 문을 열고, 그것도 매일 같은 시간에 여는 게 아니에요.
enter_building/1 함수를 현재 시각과 함께 호출해요. 현재 시각은 get_new_passport/3의 첫 번째 인자로 주어져요. 건물이 열려 있으면 함수는 :ok와 나중에 필요할 타임스탬프가 담긴 튜플을 반환하고, 그렇지 않으면 :error와 메시지가 담긴 튜플을 반환해요. 지금은 해피 패스에서 :ok 튜플을 반환하면 돼요.
:error 튜플을 받았다면 else 블록을 사용해 그 튜플을 반환해요.
안내 데스크는 유난히 긴 커피 타임을 가지는 걸로 악명이 높아요. 운 좋게 그곳에서 누군가를 만나면, 그 사람이 생년월일에 따라 어느 창구로 가야 하는지 설명해 주는 매뉴얼을 줄 거예요.
find_counter_information/1 함수를 현재 시각과 함께 호출해요. :ok와 익명 함수로 표현된 매뉴얼이 담긴 튜플을 받거나, :coffee_break와 추가 안내가 담긴 튜플을 받게 돼요. 매뉴얼을 받는 해피 패스에서는 그 매뉴얼을 생년월일(get_new_passport/3의 두 번째 인자)에 적용해요. 그러면 가야 할 창구 번호를 반환해요. 그 창구 번호가 담긴 :ok 튜플을 반환해요.
:coffee_break 메시지를 받으면 :retry와 현재 시각에서 15분 뒤를 가리키는 NaiveDateTime이 담긴 튜플을 반환해요. 앞에서처럼 :error 튜플을 받으면 그대로 반환해요.
왠일인지 창구마다 요구하는 신청서 색이 달라요. 물론 웹사이트에서 가장 먼저 찾은 걸 출력했으니, 해피 패스에 집중하며 잘 되기를 바라요.
stamp_form/3 함수를 입구에서 받은 타임스탬프, 창구, 그리고 가져온 신청서(get_new_passport/3의 마지막 인자)와 함께 호출해요. :ok와, 여권 번호를 확인하는 데 사용될 체크섬이 담긴 튜플을 받거나 :error와 메시지가 담긴 튜플을 받게 돼요. 해피 패스에서는 체크섬이 담긴 :ok 튜플을 반환하게 해요. :error 튜플을 받으면 그대로 반환해요.
드디어 필요한 서류를 모두 갖췄어요.
앞서 받은 타임스탬프, 창구, 체크섬과 함께 get_new_passport_number/3을 호출해요. 최종 여권 번호가 담긴 문자열을 받게 돼요. 이제 남은 일은 그 문자열을 :ok와 함께 튜플로 반환하고 집으로 가는 것뿐이에요.
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.