defmodule Mix.Tasks.ZoiForge.Gen do
@moduledoc """
Generates Elixir modules from JSON Schema files.
mix zoi_forge.gen
mix zoi_forge.gen --prefix Rusl --source priv/schemas --output lib/schemas
## Switches
* `--prefix` - Top-level module namespace prefix (default: active Mix project app name)
* `--source` - Directory containing `*.schema.json` files (default: `"priv/schemas"`)
* `--output` - Directory for generated Elixir modules (default: `"lib/schemas"`)
"""
use Mix.Task
@shortdoc "Generates Elixir modules from JSON Schema files"
@switches [
prefix: :string,
source: :string,
output: :string
]
@impl Mix.Task
def run(args) do
Mix.Task.run("app.config")
{opts, _argv, _invalid} = OptionParser.parse(args, strict: @switches)
config =
opts
|> Map.new()
|> Map.take([:prefix, :source, :output])
|> Map.new(fn
{:source, value} -> {:source_dir, value}
{:output, value} -> {:output_dir, value}
other -> other
end)
|> Mix.ZoiForge.Config.build()
case ZoiForge.Generator.run(config) do
{:ok, generated} ->
Enum.each(generated, fn {module_name, output_path} ->
Mix.shell().info("Generated: #{module_name} -> #{output_path}")
end)
{:error, reason} ->
Mix.raise("zoi_forge.gen failed: #{inspect(reason)}")
end
end
end