lib/mix/tasks/file/watch.ex

defmodule Mix.Tasks.File.Watch do
  @shortdoc FileWatch.MixProject.description()
  @moduledoc """
  #{@shortdoc} v#{FileWatch.MixProject.version()}

  ### Show config template

  configuration details are described in it.

  ```
  mix file.watch --config-template
  ```

  ### Start watch

  ```
  mix file.watch
  ```
  """

  use Mix.Task

  alias FileWatch.Assets

  @doc false
  def run(args) do
    assets_dir_path = Application.app_dir(:file_watch, ["priv"])

    case OptionParser.parse(args, strict: [config_template: :boolean]) do
      {[], [], []} ->
        config = Application.get_all_env(:file_watch)

        if config == [] do
          """
          :file_watch config doesn't exist in config file,
          --config-template option shows config template
          """
          |> FileWatch.highlight()
          |> Mix.raise()
        else
          wrapper_file_path = Path.join(assets_dir_path, Assets.wrapper_file_name())
          FileWatch.run_impl(wrapper_file_path)
        end

      {[config_template: true], [], []} ->
        show_config_template(assets_dir_path)

      _ ->
        help()
    end
  end

  defp help(), do: @moduledoc |> FileWatch.highlight() |> IO.puts()

  defp show_config_template(assets_dir_path) do
    "#{Path.join(assets_dir_path, "config.exs") |> File.read!()}"
    |> FileWatch.highlight()
    |> IO.puts()
  end
end