Current section
Files
Jump to
Current section
Files
lib/mix/tasks/bex_template.eex
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