Elixir JSON parsing with descriptive failures

Elixir
defmodule JsonParse do
  def parse(text) when is_binary(text) do
    try do
      {:ok, :json.decode(text)}
    rescue
      error ->
        {:error, "invalid JSON: #{Exception.message(error)}"}
    end
  end

  def parse_object!(text) do
    case parse(text) do
      {:ok, value} when is_map(value) -> value
      {:ok, value} -> raise ArgumentError, "expected object, got #{inspect(value)}"
      {:error, reason} -> raise ArgumentError, reason
    end
  end
end