lib/sf_food_trucks.ex

defmodule SfFoodTrucks do
  @moduledoc """
  Fetches food truck data from the San Francisco government API.
  """

  require HTTPoison
  require IO
  require CSV

  def fetch_data do
    response =
      HTTPoison.get("https://data.sfgov.org/api/views/rqzj-sfat/rows.csv")
      |> handle_response

    case response do
      {:ok, body} ->
        {:ok, io_device} = StringIO.open(body)
        io_device
        |> IO.stream(:line)
        |> CSV.decode(headers: true)
        |> Enum.map(&create_map/1)

      {:error, reason} ->
        {:error, reason}
    end
  end

  defp handle_response({:ok, %{body: body}}), do: {:ok, body}
  defp handle_response({:error, reason}), do: {:error, reason}

  defp create_map({:ok, row}), do: Map.new(row)
end