defmodule Mix.Tasks.Phx.Custom.Web do @shortdoc "Patch project with custom Web template" @moduledoc """ #{@shortdoc}. mix phx.custom.web """ use Mix.Task alias PhxCustom.Web @impl Mix.Task def run(args) do parse_args(args) |> validate |> process end def parse_args(args) do OptionParser.parse(args, strict: []) |> elem(1) |> args_to_internal_representation() end defp args_to_internal_representation([project_root]) do {project_root} end defp args_to_internal_representation(_) do :help end defp validate(args) do args |> validate_project_root end defp validate_project_root({project_root} = args) do case File.lstat(project_root) do {:ok, %File.Stat{type: :directory}} -> args _ -> IO.puts("invalid project root.\n") System.halt(0) end end def process({project_root}) do root = Path.expand(project_root, File.cwd!()) Web.patch(root) end end