henriquesati

henriquesati

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

First Post!

al2o3cr

al2o3cr

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:

https://github.com/sheharyarn/memento/blob/b27a1ad654bdc9200c82d5e74e86624a03edc1d7/lib/memento/mnesia.ex#L62-L84

Last Post!

henriquesati

henriquesati

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

Where Next?

Popular in Questions Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a &gt; b) do {:ok, "a"} end if (a &lt; b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New

Other popular topics Top

minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement