lib/k6/template.ex

defmodule K6.Template do
  @moduledoc """
  Utility functions for a k6 template
  """
  @default_host_and_port {"localhost", 4000}

  @callback needs_utilities() :: [String.t()]
  @callback create(filename :: String.t(), opts :: keyword) :: boolean()

  defmacro __using__(_) do
    quote do
      import Mix.Generator
      import K6.Template

      @behaviour K6.Template

      @impl true
      def needs_utilities, do: []

      defoverridable needs_utilities: 0

      @spec generate_and_save(binary, keyword) :: :ok
      def generate_and_save(filename, opts) do
        directory_path = Path.dirname(filename)

        unless File.exists?(directory_path), do: create_directory(directory_path)
        K6.Utilities.create(directory_path, needs_utilities())
        create(filename, opts)
        :ok
      end
    end
  end

  def template_path(template) do
    Path.join([Application.app_dir(:k6), "priv/templates/", template])
  end

  def default_host_and_port, do: @default_host_and_port
end