lib/mix/tasks/gen_icon.ex

defmodule Mix.Tasks.PhxWc.GenIcons do
  # Generate Material Design Icons
  # try to define with macro, it's too slow

  @moduledoc """
  Generate Phoenix.WebComponent.MaterialDesignIcons fron 7000+ svg files
  """
  use Mix.Task

  @shortdoc "Generate Phoenix.WebComponent.MaterialDesignIcons.ex file"
  def run(_) do
    Mix.Task.run("app.start")

    icons =
      File.ls!(Application.app_dir(:phoenix_webcomponent, "priv/mdi/svg"))
      |> Enum.filter(&String.ends_with?(&1, ".svg"))
      |> Enum.map(&String.trim(&1, ".svg"))

    quoted = EEx.compile_file("#{__DIR__}/material_design_icons.eex")
    {result, _bindings} = Code.eval_quoted(quoted, icons: icons)

    fl = Path.expand("../../phoenix_webcomponent/material_design_icons.ex", __DIR__)

    File.write!(fl, result)
  end
end