Packages

The helper application providing tools to convert arbitrary function calls to behaviour-driven calls

Current section

Files

Jump to
bex lib mix tasks bex_template.eex
Raw

lib/mix/tasks/bex_template.eex

defmodule <%= inspect(@behaviour_module) %> do
@moduledoc false
_ = """
Behaviour wrapping <%= inspect(@module) %>
"""
<%= for {_fun, _arity, _args, spec} <- @funs do %>
@doc false
@callback <%= spec %>
<% 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, _spec} <- @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, _spec} <- @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