Best approach to replace early exits the elixir way

artem
Fri, 09 Sep 2022 12:45:20 +0000
Questions / Help

Hi all

I am still in my early days with Elixir and relatively new to functional languages (did one hobby project in Elm), so most interested in figuring the elixir ways for this or that.

Quite often I am in the situation where I need to have a look at the function input and do an early exit, yet an input validation is something beyond what simple pattern matching or guard could do - a function needs to be called.

For example, in my weather forecast live view there is a handle_event that should only go fetch weather if user has chosen a date already. Otherwise, we just do nothing:

 def handle_event("fetch-weather", _, socket) do
  weatherRow = if (socket.assigns[:target_date] == nil) do
    []
  else
    # actually fill weatherRow with some sensible info
  end
  socket = assign(socket,
      :weatherRow, weatherRow
  )
  {:noreply, socket}
 end

All these argument validation feel to not nice in elixir, but I can’t really think of a good solution.
The best I could think of is about making an original function just extract the data to be validated:

def handle_event("fetch-weather", _, socket) do
  target_date = socket.assigns[:target_date]
  weatherRow = target_date |> handle_fetch_weather_inner
  socket = assign(socket,
       :weatherRow, weatherRow
   )
   {:noreply, socket}
end

defp handle_fetch_weather_inner(nil)
  []
end

defp handle_fetch_weather_inner(nonEmptyTargetDate)
  # Fetch weather using the target date
end

How would you do something like this?
Am I missing some way to pattern match or put guard on the original handle_event?

5 posts - 4 participants