Compile-time helpers for generating RPC wrapper functions.
Used by both EasyRpc.RpcWrapper and EasyRpc.DefRpc to ensure
consistent behaviour when expanding macros.
Responsibilities:
- Normalising function info tuples into
{name, arity, opts} - Resolving final function names (
:as/:new_namesupport) - Merging per-function opts over global
WrapperConfig - Generating AST variable lists for macro
defbodies - Validating per-function option values
Summary
Functions
Generates AST variable nodes for use in macro-expanded def bodies.
Returns true if the function should be generated as private.
Merges per-function opts over global_config, returning a new WrapperConfig.
Normalises a function spec tuple into {name, arity_or_args, opts}.
Parses an arity specification into a canonical form.
Resolves the effective function name, honouring :as and :new_name opts.
Validates all keys and values in a per-function opts list.
Raises EasyRpc.Error on any unknown key or bad value.
Types
@type function_info() :: {name :: atom(), arity :: non_neg_integer() | [atom()], opts :: keyword()}
@type function_opts() :: keyword()
Functions
@spec generate_arg_vars(non_neg_integer() | [atom()]) :: [Macro.t()]
Generates AST variable nodes for use in macro-expanded def bodies.
Examples
generate_arg_vars(2)
#=> [Macro.var(:arg_1, nil), Macro.var(:arg_2, nil)]
generate_arg_vars([:user_id, :name])
#=> [Macro.var(:user_id, nil), Macro.var(:name, nil)]
@spec is_private?(function_opts()) :: boolean()
Returns true if the function should be generated as private.
@spec merge_config(EasyRpc.WrapperConfig.t(), function_opts()) :: EasyRpc.WrapperConfig.t()
Merges per-function opts over global_config, returning a new WrapperConfig.
Automatically sets error_handling: true when retry > 0.
@spec normalize_function_info(tuple()) :: function_info()
Normalises a function spec tuple into {name, arity_or_args, opts}.
Raises EasyRpc.Error on unrecognised formats.
Examples
iex> normalize_function_info({:get_user, 1})
{:get_user, 1, []}
iex> normalize_function_info({:get_user, [:user_id]})
{:get_user, [:user_id], []}
iex> normalize_function_info({:get_user, 1, [retry: 3]})
{:get_user, 1, [retry: 3]}
iex> normalize_function_info({:get_user, [:user_id], [retry: 3]})
{:get_user, [:user_id], [retry: 3]}
@spec parse_arity(integer() | list()) :: non_neg_integer() | [atom()]
Parses an arity specification into a canonical form.
- Integer → used directly
[]→0[atom]→ list of named arg atoms
Raises EasyRpc.Error on invalid input.
@spec resolve_function_name(atom(), function_opts()) :: atom()
Resolves the effective function name, honouring :as and :new_name opts.
Examples
iex> resolve_function_name(:get_user, [])
:get_user
iex> resolve_function_name(:get_user, [as: :fetch_user])
:fetch_user
@spec validate_function_opts!(function_opts()) :: :ok
Validates all keys and values in a per-function opts list.
Raises EasyRpc.Error on any unknown key or bad value.
Valid keys: :as, :new_name, :retry, :timeout, :sleep_before_retry,
:error_handling, :private, :args.