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

JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
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
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

Other popular topics Top

KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36820 110
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
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

We're in Beta

About us Mission Statement