defmodule <%= inspect(@behaviour_module) %> do @moduledoc false _ = """ Behaviour wrapping <%= inspect(@module) %> """ <%= for {fun, arity} <- @funs do %> @doc false @callback <%= fun %>(<%= 1..arity |> Enum.map(&"arg_#{&1} :: any()") |> Enum.join(", ") %>) :: any() <% end %> # default implementation @actual_impls Application.compile_env(:bex, :impls, %{}) @actual_impl Map.get(@actual_impls, <%= inspect(@module) %>, <%= inspect(@behaviour_impl_module)%>) <%= for {fun, arity} <- @funs do %> @doc false defdelegate <%= fun %>(<%= 1..arity |> Enum.map(&"arg_#{&1}") |> Enum.join(", ") %>), to: @actual_impl @doc false def <%= fun %>(<%= 1..arity |> Enum.map(&"arg_#{&1}") |> Enum.join(", ") %>, %Macro.Env{} = env) do event_prefix = Bex.telemetry_event_base(env) :telemetry.execute( event_prefix ++ [:start], Bex.telemetry_measurements_base(%{}), %{ <%= 1..arity |> Enum.map(&"arg_#{&1}: arg_#{&1}") |> Enum.join(",\n") %> } ) result = <%= fun %>(<%= 1..arity |> Enum.map(&"arg_#{&1}") |> Enum.join(", ") %>) :telemetry.execute( event_prefix ++ [:stop], Bex.telemetry_measurements_base(%{}), %{result: result} ) result end <% end %> end defmodule <%= inspect(@behaviour_impl_module) %> do @moduledoc false _ = """ Default implementation for the behaviour wrapping <%= inspect(@module) %> """ @behaviour <%= inspect(@behaviour_module) %> <%= for {fun, arity} <- @funs do %> @impl <%= inspect(@behaviour_module) %> def <%= fun %>(<%= 1..arity |> Enum.map(&"arg_#{&1}") |> Enum.join(", ") %>) do <%= inspect(@module) %>.<%= fun %>(<%= 1..arity |> Enum.map(&"arg_#{&1}") |> Enum.join(", ") %>) end <% end %> end case {Code.ensure_compiled(Mox), Mix.env()} do {{:module, Mox}, :test} -> <%= inspect(@behaviour_module) %> |> Module.concat(Mox) |> Mox.defmock(for: <%= inspect(@behaviour_module) %>) {_, :test} -> IO.warn("Please add `mox` to deps in `test` env") _ -> :ok end