2024-06-22 11:09:35 +12:00
|
|
|
defmodule Mix.Tasks.Ash.Gen.Enum do
|
2024-07-27 05:43:51 +12:00
|
|
|
@example "mix ash.gen.enum MyApp.Support.Ticket.Types.Status open,closed --short-name ticket_status"
|
2024-06-22 11:09:35 +12:00
|
|
|
@moduledoc """
|
|
|
|
Generates an Ash.Type.Enum
|
|
|
|
|
2024-07-09 09:15:52 +12:00
|
|
|
## Example
|
|
|
|
|
|
|
|
```bash
|
2024-07-27 05:43:51 +12:00
|
|
|
#{@example}
|
2024-07-09 09:15:52 +12:00
|
|
|
```
|
2024-06-22 11:09:35 +12:00
|
|
|
|
|
|
|
## Options
|
|
|
|
|
|
|
|
- `--short-name`, `-s`: Register the type under the provided shortname, so it can be referenced like `:short_name` instead of the module name.
|
|
|
|
"""
|
|
|
|
|
|
|
|
@shortdoc "Generates an Ash.Type.Enum"
|
|
|
|
use Igniter.Mix.Task
|
|
|
|
|
2024-07-10 01:08:03 +12:00
|
|
|
@impl Igniter.Mix.Task
|
|
|
|
def info(_argv, _parent) do
|
|
|
|
%Igniter.Mix.Task.Info{
|
|
|
|
schema: [
|
|
|
|
short_name: :string
|
|
|
|
],
|
2024-07-27 05:43:51 +12:00
|
|
|
example: @example,
|
|
|
|
positional: [:module_name, :types],
|
2024-07-10 01:08:03 +12:00
|
|
|
aliases: [
|
|
|
|
s: :short_name
|
|
|
|
]
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2024-06-22 11:09:35 +12:00
|
|
|
@impl Igniter.Mix.Task
|
2024-07-27 05:43:51 +12:00
|
|
|
def igniter(igniter, argv) do
|
|
|
|
{%{module_name: module_name, types: types}, argv} = positional_args!(argv)
|
|
|
|
|
2024-06-22 11:09:35 +12:00
|
|
|
enum = Igniter.Code.Module.parse(module_name)
|
|
|
|
file_name = Igniter.Code.Module.proper_location(enum)
|
|
|
|
|
2024-07-10 01:08:03 +12:00
|
|
|
opts = options!(argv)
|
2024-06-22 11:09:35 +12:00
|
|
|
|
|
|
|
short_name =
|
|
|
|
if opts[:short_name] do
|
|
|
|
String.to_atom(opts[:short_name])
|
|
|
|
end
|
|
|
|
|
|
|
|
types =
|
|
|
|
types
|
|
|
|
|> String.split(",")
|
|
|
|
|> Enum.map(&String.to_atom/1)
|
|
|
|
|
|
|
|
igniter
|
|
|
|
|> Igniter.create_new_elixir_file(file_name, """
|
|
|
|
defmodule #{inspect(enum)} do
|
|
|
|
use Ash.Type.Enum, values: #{inspect(types)}
|
|
|
|
end
|
|
|
|
""")
|
|
|
|
|> then(fn igniter ->
|
|
|
|
if short_name do
|
|
|
|
Igniter.Project.Config.configure(
|
|
|
|
igniter,
|
|
|
|
"config.exs",
|
|
|
|
:ash,
|
|
|
|
[:custom_types, short_name],
|
|
|
|
enum
|
|
|
|
)
|
|
|
|
else
|
|
|
|
igniter
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end
|