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