Maybe wrong compiling type warning using memento/mnesia

I’m using Mnesia with Memento. The compiler it’s warning that the return type {:error, _} | {:ok, _} will never match my with clause (I will append the code), but when I test the function, it only returns the :ok atom

  def swap_pk(payload, public, new_contract) do
    Logger.debug("contract: #{inspect(new_contract)}")
    Logger.debug("old pk: #{payload}")
    Logger.debug("new pk: #{public}")

    try do
      with :ok <- delete_record_by_pk(payload),
           {:ok, record} <- insert_record(public, @awaiting_payment, new_contract) do
        {:ok, record}
      else
        _ ->
          Logger.error("Erro durante swap_pk")
          error = FormatError.initerror("erro", "swap_pk")
          {:error, error }
      end
    rescue
      exception ->
        Logger.error("swap_pk failed: #{inspect(exception)}")
        {:error, exception}
    end
  end

    @spec delete_record_by_pk(any()) :: {:error, any()} | {:ok, any()}
  @doc "Deleta um registro pelo primary key."
  def delete_record_by_pk(pk) do
    Logger.debug("ab")
    req = Memento.transaction(fn ->
      Query.delete(MnesiaContract, pk)
    end)
    Logger.debug("delete_record_by_pk response: #{req}")
    req
  end

as you can see, the spec is typed as a tuple

14:38:53.970 [debug] contract: %{name: "Test Contract", value: 100}
14:38:53.978 [debug] old pk: test_pk_123
14:38:53.978 [debug] new pk: new_pk_456
14:38:53.978 [debug] ab
14:38:53.978 [debug] delete_record_by_pk response: ok

as you can see, the response is purely the :ok, but the compiler keeps typing it as a tuple

If you tell Dialyzer things that aren’t true, it will believe you :stuck_out_tongue:

I suspect fixing the return value to be {:error, any()} | :ok will fix things.

Edit: it also appears that the spec for Memento.Transaction.execute is wrong; it’s listed as {:error, any()} | {:ok, any()} but actually comes from Memento.Mnesia.handle_result, which can only return {:error, any()} | :ok:

I dont know how are the type system currently working, but I do not have to type anything, it automatically types everytime I run my code. I tried to erase the incorrect typing, but it keeps generating this one

btw ill take a look on this answer to where i’m doing the wrong thing, thanks!