defmodule Mix.Tasks.ZoiForge.Verify do
@moduledoc """
Verifies generated schema modules are up to date with vendored JSON Schema files.
mix zoi_forge.verify
mix zoi_forge.verify --prefix Rusl --source priv/schemas --output lib/schemas
"""
use Mix.Task
@shortdoc "Verifies generated schema modules are fresh"
@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.Verify.run(config) do
:ok ->
Mix.shell().info(
"Derived schemas are up to date with #{config[:source_dir] || "priv/schemas"}"
)
{:error, {:stale, stale}} ->
Mix.shell().error("Derived schemas are stale. Run: mix schemas:generate")
Mix.shell().error("Stale files:")
Enum.each(stale, fn path ->
Mix.shell().error(" #{path}")
end)
Mix.raise("stale generated schema modules")
end
end
end