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