Packages
riptide
0.1.15
0.5.2
0.5.1
0.5.0-beta9
0.5.0-beta8
0.5.0-beta7
0.5.0-beta6
0.5.0-beta5
0.5.0-beta4
0.5.0-beta3
0.5.0-beta2
0.5.0-beta11
0.5.0-beta10
0.5.0-beta
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-bd63a38
0.2.79
0.2.78
0.2.74
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A data first framework for building realtime applications
Current section
Files
Jump to
Current section
Files
lib/riptide/command.ex
defmodule Riptide.Command do
require Logger
@callback handle_call(msg :: any(), from :: any(), state :: any()) ::
{:reply, any(), any()} | nil
@callback handle_cast(msg :: any(), from :: any(), state :: any()) :: {:noreply, any()} | nil
@callback handle_info(msg :: any(), from :: any(), state :: any()) :: {:noreply, any()} | nil
defmacro(__using__(_opts)) do
quote do
@behaviour Riptide.Command
@before_compile Riptide.Command
end
end
def process_message(commands, msg, fun, from, state) do
[Riptide.Command.Echo | commands]
|> Stream.map(&safe_trigger(&1, fun, msg, from, state))
|> Stream.filter(fn result -> result !== nil end)
|> Enum.at(0)
|> case do
nil -> {:error, :invalid_message, state}
result -> result
end
end
def safe_trigger(mod, fun, msg, from, state) do
try do
apply(mod, fun, [msg, from, state])
rescue
e ->
:error
|> Exception.format(e, __STACKTRACE__)
|> Logger.error(crash_reason: {e, __STACKTRACE__})
{:error, e, state}
catch
_, e ->
:throw
|> Exception.format(e, __STACKTRACE__)
|> Logger.error(crash_reason: {e, __STACKTRACE__})
{:error, e, state}
end
end
defmacro __before_compile__(_opts) do
quote do
def handle_call(msg, from, state), do: nil
def handle_cast(msg, _from, state), do: nil
def handle_info(msg, _from, state), do: nil
end
end
end
defmodule Riptide.Command.Echo do
use Riptide.Command
def handle_call(%{action: "riptide.echo", body: body}, _, state) do
{:reply, body, state}
end
end