Packages
spawn_sdk
0.6.0
2.0.0-RC9
2.0.0-RC8
2.0.0-RC7
2.0.0-RC6
2.0.0-RC5
2.0.0-RC4
2.0.0-RC3
2.0.0-RC14
2.0.0-RC13
2.0.0-RC12
2.0.0-RC11
2.0.0-RC10
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc3
1.0.0-rc16
1.0.0-rc1
1.0.0-rc.38
1.0.0-rc.37
1.0.0-rc.36
1.0.0-rc.35
1.0.0-rc.34
1.0.0-rc.33
1.0.0-rc.32
1.0.0-rc.31
1.0.0-rc.30
1.0.0-rc.29
1.0.0-rc.28
1.0.0-rc.27
1.0.0-rc.26
1.0.0-rc.25
1.0.0-rc.24
1.0.0-rc.23
1.0.0-rc.22
1.0.0-rc.21
1.0.0-rc.20
1.0.0-rc.19
1.0.0-rc.18
1.0.0-rc.17
1.0.0-rc.2
0.6.3
0.6.2
0.6.1
0.6.0
0.5.5
0.5.4
0.5.3
0.5.1
0.5.0
0.5.0-rc.13
0.5.0-rc.12
0.5.0-rc.11
0.5.0-rc.10
0.5.0-rc.9
0.5.0-rc.8
0.5.0-rc.7
0.5.0-rc.6
0.5.0-rc.5
0.5.0-rc.3
0.5.0-alpha.13
0.5.0-alpha.12
0.5.0-alpha.11
0.5.0-alpha.10
0.5.0-alpha.9
0.5.0-alpha.8
0.5.0-alpha.7
0.5.0-alpha.6
0.5.0-alpha.5
0.5.0-alpha.4
0.5.0-alpha.3
0.5.0-alpha.2
0.5.0-alpha.1
0.1.0
Spawn Elixir SDK is the support library for the Spawn Actors System
Current section
Files
Jump to
Current section
Files
lib/defact.ex
defmodule SpawnSdk.Defact do
@moduledoc """
Define actions like a Elixir functions
### Internal :defact_exports metadata saved as
[
{action_name, %{timer: 10_000}},
{action_name2, %{timer: nil}}
]
"""
defmacro __using__(_args) do
quote do
import SpawnSdk.Defact
Module.register_attribute(__MODULE__, :defact_exports, accumulate: true)
@set_timer nil
end
end
defmacro defact(call, do: block) do
define_defact(:def, call, block, __CALLER__)
end
defp define_defact(kind, call, block, env) do
{name, args} = decompose_call!(kind, call, env)
{payload, context} =
case args do
[payload, context] -> {payload, context}
[context] -> {nil, context}
end
if is_nil(payload) do
quote do
Module.put_attribute(
__MODULE__,
:defact_exports,
Macro.escape({unquote(name), %{timer: @set_timer}})
)
def handle_command({unquote(name), _}, unquote(context)) do
unquote(block)
end
end
else
quote do
Module.put_attribute(
__MODULE__,
:defact_exports,
Macro.escape({unquote(name), %{timer: @set_timer}})
)
def handle_command({unquote(name), unquote(payload)}, unquote(context)) do
unquote(block)
end
end
end
end
defp decompose_call!(kind, {:when, _, [call, _guards]}, env),
do: decompose_call!(kind, call, env)
defp decompose_call!(_kind, {{:unquote, _, [name]}, _, args}, _env) do
{parse_command_name(name), args}
end
defp decompose_call!(kind, call, env) do
case Macro.decompose_call(call) do
{name, args} ->
{parse_command_name(name), args}
:error ->
compile_error!(
env,
"first argument of #{kind}n must be a call, got: #{Macro.to_string(call)}"
)
end
end
defp parse_command_name(command) when is_atom(command), do: Atom.to_string(command)
defp parse_command_name(command) when is_binary(command), do: command
defp compile_error!(env, description) do
raise CompileError, line: env.line, file: env.file, description: description
end
end