lib/emqtt_failover/connection_handler/basic.ex

defmodule EmqttFailover.ConnectionHandler.Parent do
  @moduledoc """
  `EmqttFailover.ConnectionHandler` which sends messages back to a parent
  process.

  Messages:
  - `{:connected, pid}` on connection, where `pid` is the `EmqttFailover.Connection` process
  - `{:disconnected, pid, reason}` on disconnection
  - `{:message, pid, message}` on receipt of a message

  Options:
  - `parent` (required): parent process to send messages to
  - `topics` (optional): list of topics to subscribe to on connection.
  """
  use EmqttFailover.ConnectionHandler

  defstruct [:parent, :topics]

  @impl EmqttFailover.ConnectionHandler
  def init(opts) do
    state = %__MODULE__{
      parent: Keyword.fetch!(opts, :parent),
      topics: Keyword.get(opts, :topics, [])
    }

    {:ok, state}
  end

  @impl EmqttFailover.ConnectionHandler
  def handle_connected(state) do
    send(state.parent, {:connected, self()})
    {:ok, state.topics, state}
  end

  @impl EmqttFailover.ConnectionHandler
  def handle_disconnected(reason, state) do
    send(state.parent, {:disconnected, self(), reason})
    {:ok, state}
  end

  @impl EmqttFailover.ConnectionHandler
  def handle_message(message, state) do
    send(state.parent, {:message, self(), message})
    {:ok, state}
  end
end