Packages
forge_sdk
0.26.3
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.7
1.0.6
1.0.4
1.0.4-p1
1.0.4-p0
1.0.3
1.0.2
1.0.2-p1
1.0.1
1.0.1-p1
1.0.0
0.40.6
0.40.5
0.40.4
0.40.3
0.40.2
0.40.1
0.40.0
0.39.1
0.39.0
0.38.6
0.38.5
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.5
0.37.4
0.37.3
0.37.2
0.37.1
0.37.0
0.34.0
0.33.2
0.33.1
0.33.0
0.32.2
0.32.1
0.32.0
0.31.1
0.31.0
0.30.0
0.29.1
0.29.0
0.28.3
0.28.2
0.28.1
0.28.0
0.27.4
0.27.3
0.27.2
0.27.1
0.27.0
0.26.6
0.26.5
0.26.4
0.26.3
0.26.1
0.26.0
Elixir / Erlang version of the SDK for Forge framework.
Current section
Files
Jump to
Current section
Files
lib/forge_sdk/rpc/builder.ex
defmodule ForgeSdk.Rpc.Builder do
@moduledoc """
Macro for building RPC easily
"""
alias ForgeSdk.Rpc.Helper
alias ForgeSdk.Util
defmacro rpc(service, options, contents \\ []) do
compile(service, options, contents)
end
# credo:disable-for-lines:55
defp compile(service, options, contents) do
{body, options} =
cond do
Keyword.has_key?(contents, :do) ->
{contents[:do], options}
Keyword.has_key?(options, :do) ->
Keyword.pop(options, :do)
true ->
raise ArgumentError, message: "expected :do to be given as option"
end
mod = to_request_mod(service)
quote bind_quoted: [
mod: mod,
service: service,
options: options,
body: Macro.escape(body, unquote: true)
] do
default_opts = options[:opts] || []
cond do
options[:request_stream] == true ->
def unquote(service)(reqs, chan \\ nil, opts \\ []) do
chan = chan || Util.get_chan()
reqs = Helper.to_req(reqs, unquote(mod))
fun = fn var!(res) -> unquote(body) end
opts = Keyword.merge(unquote(default_opts), opts)
Helper.send_stream(unquote(service), chan, reqs, opts, fun)
end
options[:response_stream] == true and options[:no_params] == true ->
def unquote(service)(chan \\ nil, opts \\ []) do
chan = chan || Util.get_chan()
req = apply(unquote(mod), :new, [])
fun = fn var!(res) -> unquote(body) end
opts = Keyword.merge(unquote(default_opts), opts)
Helper.send(unquote(service), chan, req, opts, fun)
end
options[:response_stream] == true ->
def unquote(service)(req, chan \\ nil, opts \\ []) do
chan = chan || Util.get_chan()
req = Helper.to_req(req, unquote(mod))
fun = fn var!(res) -> unquote(body) end
opts = Keyword.merge(unquote(default_opts), opts)
Helper.send(unquote(service), chan, req, opts, fun)
end
options[:no_params] == true ->
def unquote(service)(chan \\ nil, opts \\ []) do
chan = chan || Util.get_chan()
req = apply(unquote(mod), :new, [])
fun = fn var!(res) -> unquote(body) end
opts = Keyword.merge(unquote(default_opts), opts)
Helper.send(unquote(service), chan, req, opts, fun)
end
true ->
def unquote(service)(req, chan \\ nil, opts \\ []) do
chan = chan || Util.get_chan()
req = Helper.to_req(req, unquote(mod))
fun = fn var!(res) -> unquote(body) end
opts = Keyword.merge(unquote(default_opts), opts)
Helper.send(unquote(service), chan, req, opts, fun)
end
end
end
end
defp to_request_mod(service) do
name =
service
|> Atom.to_string()
|> Recase.to_pascal()
Module.concat(ForgeAbi, "Request#{name}")
end
# defp to_args(data) do
# data
# |> Map.keys()
# |> List.delete(:__struct__)
# |> Enum.map(&Macro.var(&1, __MODULE__))
# end
end