30 lines
749 B
Elixir
30 lines
749 B
Elixir
alias Experimental.{GenStage}
|
|
defmodule RPC.MessageHandler do
|
|
@moduledoc """
|
|
Parses rpc messages and forwars them to the given handler.
|
|
"""
|
|
use GenStage
|
|
import RPC.Parser
|
|
|
|
@doc """
|
|
Requires configuration of a handler.
|
|
Handler requires a callback of handle_incoming/1 to be defined
|
|
which takes a parsed rpc message. Should probably
|
|
make @handler a behavior
|
|
and document it. l o l.
|
|
"""
|
|
|
|
def start_link(handler) do
|
|
GenStage.start_link(__MODULE__, handler)
|
|
end
|
|
|
|
def init(handler) do
|
|
{:consumer, handler, subscribe_to: [RPC.MessageManager]}
|
|
end
|
|
|
|
def handle_events(events, _from, handler) do
|
|
for event <- events, do: event |> parse |> handler.handle_incoming
|
|
{:noreply, [], handler}
|
|
end
|
|
end
|