Skip to main content

lib/mix/tasks/host_kit.render.ex

defmodule Mix.Tasks.HostKit.Render do
  @moduledoc "Renders a HostKit resource by kind and name."

  use Mix.Task

  @shortdoc "Render one HostKit resource"

  @impl true
  def run(args) do
    Mix.Task.run("app.start")

    {opts, positional} = OptionParser.parse!(args, strict: [require: :keep])

    case positional do
      [path, kind, name] -> render(path, kind, name, opts)
      _args -> Mix.raise("usage: mix host_kit.render [--require FILE] PATH KIND NAME")
    end
  end

  defp render(path, kind, name, opts) do
    project = HostKit.load!(path, require: Keyword.get_values(opts, :require))
    id = {String.to_existing_atom(kind), name}

    case HostKit.Render.render(project, id) do
      {:ok, iodata} -> IO.write(iodata)
      {:error, reason} -> Mix.raise("could not render #{inspect(id)}: #{inspect(reason)}")
    end
  end
end