EasyRpc.Utils.FunctionGenerator (EasyRpc v0.9.1)

Copy Markdown View Source

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_name support)
  • Merging per-function opts over global WrapperConfig
  • Generating AST variable lists for macro def bodies
  • 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

function_info()

@type function_info() ::
  {name :: atom(), arity :: non_neg_integer() | [atom()], opts :: keyword()}

function_opts()

@type function_opts() :: keyword()

Functions

generate_arg_vars(n)

@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)]

is_private?(opts)

@spec is_private?(function_opts()) :: boolean()

Returns true if the function should be generated as private.

merge_config(global, fun_opts)

Merges per-function opts over global_config, returning a new WrapperConfig.

Automatically sets error_handling: true when retry > 0.

normalize_function_info(invalid)

@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]}

parse_arity(n)

@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.

resolve_function_name(original, opts)

@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

validate_function_opts!(opts)

@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.