Warning on :gen_statem behaviours

Good morning,
I’m using the :gen_statem erlang behaviour for modeling a process and the compiler is throwing me some warnings about bad implementations behaviours

This is the module definition

defmodule Collector.Plubio do
  @behaviour :gen_statem

I am doing the calls like that

  @spec state?() :: {:ok, :waiting | :collecting} | {:error, :timeout}
  def state?() do
    try do
      case :gen_statem.call(Collector.Plubio, :current_state, 5000) do
	:waiting -> {:ok, :waiting}
	:collecting -> {:ok, :collecting}
      end
    rescue
      RuntimeError -> {:error, :timeout}
    end
  end

And the :gen_statem.state_name/3 are like this

  @impl true
  def waiting({:call, from}, :current_state, state) do
    {:next_state, :waiting, state, {:reply, from, :waiting}}
  end

But the compiler still showing me these warnings

warning: got "@impl true" for function waiting/3 but this behaviour does not specify such callback. The known callbacks are:

  * :gen_statem.callback_mode/0 (function)
  * :gen_statem.code_change/4 (function)
  * :gen_statem.format_status/2 (function)
  * :gen_statem.handle_event/4 (function)
  * :gen_statem.init/1 (function)
  * :gen_statem.state_name/3 (function)
  * :gen_statem.terminate/3 (function)

It is my first time calling directly and erlang behaviour so probably I am forgetting something, does someone knows how to fix that?
Thank you so much:)

The error is about…

… maybe remove this?

To add to @kokolegorille’s reply, :gen_statem only has a handful of static callbacks. The other callbacks are dynamic, based on your code, and those do not get a @impl true.

2 Likes

yes, this fix the warning, thank you:).

But, what does the compiler expect about a :gen_statem.state_name/3 callback?
Shouldn’t we mention that callback?

thanks for the explanation.