defmodule <%= inspect(@behaviour_module) %> do @moduledoc false _ = """ Behaviour wrapping <%= inspect(@module) %> """ <%= for {fun, _arity, args} <- @funs do %> @doc false @callback <%= fun %>(<%= args |> Enum.map(&"#{&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, args} <- @funs do %> @doc false defdelegate <%= fun %>(<%= Enum.join(args, ", ") %>), to: @actual_impl @doc false def <%= fun %>(<%= Enum.join(args, ", ") %>, %Macro.Env{} = env) do event_prefix = Bex.telemetry_event_base(env) :telemetry.execute( event_prefix ++ [:start], Bex.telemetry_measurements_base(%{}), %{ <%= args |> Enum.map(&"#{&1}: #{&1}") |> Enum.join(",\n") %> } ) result = <%= fun %>(<%= Enum.join(args, ", ") %>) :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, args} <- @funs do %> @impl <%= inspect(@behaviour_module) %> def <%= fun %>(<%= Enum.join(args, ", ") %>) do <%= inspect(@module) %>.<%= fun %>(<%= Enum.join(args, ", ") %>) 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