ash/lib/mix/tasks/ash.codegen.ex
Zach Daniel 46ed97dd10 improvement: add ash.rollback mix task
chore: fix some naming/mix task steps
2024-04-09 20:24:08 -04:00

63 lines
1.5 KiB
Elixir

defmodule Mix.Tasks.Ash.Codegen do
@moduledoc """
Runs all codegen tasks for any extension on any resource/domain in your application.
"""
use Mix.Task
@shortdoc "Runs all codegen tasks for any extension on any resource/domain in your application."
@doc @shortdoc
def run(argv) do
Mix.Task.run("compile")
{name, argv} =
case argv do
["-" <> _ | _] ->
{nil, argv}
[first | rest] ->
{first, rest}
[] ->
{nil, []}
end
{opts, _} =
OptionParser.parse!(argv,
strict: [
name: :string,
no_format: :boolean,
dry_run: :boolean,
check: :boolean,
drop_columns: :boolean
]
)
opts = Keyword.put_new(opts, :name, name)
if !opts[:name] && !opts[:dry_run] && !opts[:check] do
raise ArgumentError, """
Name must be provided when running `ash.codegen`, unless `--dry-run` or `--check` is also provided.
Please provide a name. for example:
mix ash.codegen add_feature_for_reticulating_splines #{Enum.join(argv, " ")}
"""
end
argv
|> Ash.Mix.Tasks.Helpers.extensions!()
|> Enum.map(fn extension ->
if function_exported?(extension, :codegen, 1) do
name =
if function_exported?(extension, :name, 0) do
extension.name()
else
inspect(extension)
end
Mix.shell().info("Running codegen for #{name}...")
extension.codegen(argv)
end
end)
end
end