Skip to main content

lib/pdf_elixide/native/wrap.ex

defmodule PdfElixide.Native.Wrap do
  @moduledoc false

  @doc """
  Runs a NIF call and converts raised errors to `{:error, term()}`.
  Returns `{:ok, value}` on success.
  """
  @spec call((-> term())) :: {:ok, term()} | {:error, term()}
  def call(fun) do
    case fun.() do
      # NIF returned tagged ok
      {:ok, _} = result -> result
      # NIF returned tagged error
      {:error, _} = result -> result
      # NIF returned a bare value
      other -> {:ok, other}
    end
  rescue
    e in ErlangError -> {:error, e.original}
  end
end