defmodule Mix.Tasks.Firebird.Target.Status do @moduledoc """ Show the status of the WASM compilation target. Displays discovered sources, compiled artifacts, configuration, and prerequisite status. ## Usage mix firebird.target.status mix firebird.target.status --json """ use Mix.Task @shortdoc "Show WASM target compilation status" @switches [ output: :string, dirs: :string, json: :boolean ] @impl Mix.Task def run(args) do {opts, _rest, _invalid} = OptionParser.parse(args, switches: @switches) config = Firebird.Target.Config.from_mix_project() config = case Keyword.get(opts, :output) do nil -> config dir -> %{config | output_dir: dir} end config = case Keyword.get(opts, :dirs) do nil -> config dirs -> %{config | sources: String.split(dirs, ",", trim: true)} end status = Firebird.Target.status(config) if Keyword.get(opts, :json, false) do Mix.shell().info(Jason.encode!(status, pretty: true)) else print_status(status) end :ok end defp print_status(status) do Mix.shell().info("🔥 Firebird WASM Target Status") Mix.shell().info("") # Prerequisites prereqs = status.prerequisites Mix.shell().info(" Prerequisites:") Mix.shell().info( " wat2wasm: #{if prereqs.wat2wasm, do: "✅ installed", else: "❌ not found"}" ) Mix.shell().info(" Elixir: #{prereqs.elixir_version}") Mix.shell().info(" OTP: #{prereqs.otp_version}") Mix.shell().info("") # Sources Mix.shell().info(" Sources: #{status.sources} file(s)") Enum.each(status.source_files, fn f -> Mix.shell().info(" 📄 #{f}") end) Mix.shell().info("") # Artifacts artifacts = status.artifacts Mix.shell().info(" Output: #{status.output_dir}/") Mix.shell().info(" WAT files: #{artifacts.wat_count}") Mix.shell().info(" WASM files: #{artifacts.wasm_count}") Mix.shell().info("") # Config config = status.config Mix.shell().info(" Configuration:") Mix.shell().info(" optimize: #{config.optimize}") Mix.shell().info(" tco: #{config.tco}") Mix.shell().info(" inline: #{config.inline}") Mix.shell().info(" wat_only: #{config.wat_only}") Mix.shell().info(" source_map: #{config.source_map}") end end