defmodule Mix.Tasks.Dust.Install do @shortdoc "Install Dust into your Phoenix app" @moduledoc """ Sets up Dust in your Phoenix application. $ mix dust.install This task will: 1. Generate a `MyApp.Dust` module that wraps `use Dust` 2. Generate the cache migration via `dust.gen.migration` 3. Print instructions for remaining manual setup steps """ use Mix.Task def run(_args) do app = Mix.Project.config()[:app] app_module = app |> to_string() |> Macro.camelize() dust_module = "#{app_module}.Dust" # 1. Create the Dust module dust_module_path = "lib/#{app}/dust.ex" create_file(dust_module_path, dust_module_template(app, dust_module)) # 2. Generate migration Mix.Task.run("dust.gen.migration") # 3. Print setup instructions Mix.shell().info(""" Done! Dust has been installed. Complete the setup: 1. Add #{dust_module} to your supervision tree in lib/#{app}/application.ex: children = [ #{app_module}.Repo, #{dust_module}, #{app_module}Web.Endpoint ] 2. Add config to config/config.exs: config :#{app}, #{dust_module}, stores: ["your-org/your-store"], repo: #{app_module}.Repo 3. Add test config to config/test.exs: config :#{app}, #{dust_module}, testing: :manual 4. Set your API key: export DUST_API_KEY=dust_tok_... 5. Run migrations: mix ecto.migrate """) end defp dust_module_template(app, module_name) do """ defmodule #{module_name} do use Dust, otp_app: :#{app} end """ end defp create_file(path, content) do dir = Path.dirname(path) File.mkdir_p!(dir) if File.exists?(path) do Mix.shell().info("* skip #{path} (already exists)") else File.write!(path, content) Mix.shell().info("* creating #{path}") end end end