defmodule Mix.Tasks.Project.Gen.AppLayout do
@shortdoc "Generates a clean app layout"
@moduledoc "Generates a clean app layout."
use Igniter.Mix.Task
alias Mix.Tasks.Project.Helpers
@impl Igniter.Mix.Task
def igniter(igniter) do
app_name = Helpers.app_module(igniter)
layouts_module = Module.concat([Helpers.app_web_module(igniter), "Layouts"])
new_app_fn = app_function_ast(app_name)
Igniter.Project.Module.find_and_update_module!(igniter, layouts_module, fn zipper ->
with {:ok, zipper} <- move_to_def_node(zipper, :app) do
{:ok, Sourceror.Zipper.replace(zipper, new_app_fn)}
end
end)
end
defp move_to_def_node(zipper, name) do
Igniter.Code.Common.move_to(zipper, fn z ->
match?({:def, _, [{^name, _, _} | _]}, Sourceror.Zipper.node(z))
end)
end
defp app_function_ast(app_name) do
"""
def app(assigns) do
~H\"\"\"
#{app_name}
<.button class="bg-black font-semibold h-8 px-4 rounded text-sm text-white">
Primary Action
{render_slot(@inner_block)}
<.flash_group flash={@flash} />
\"\"\"
end
"""
|> Sourceror.parse_string!()
end
end