Skip to main content

lib/mix/tasks/bandera.flags.ex

defmodule Mix.Tasks.Bandera.Flags do
  @moduledoc "List feature flags. Use --stale [--older-than DAYS] to show unused flags."
  @shortdoc "List Bandera feature flags"
  use Mix.Task

  # Reserved prefix for segment definitions, which are stored as flags but are not
  # user-facing (kept consistent with Bandera.stale_flags/1).
  @segment_prefix "bandera_segment:"

  @impl Mix.Task
  def run(args) do
    {opts, _, _} = OptionParser.parse(args, strict: [stale: :boolean, older_than: :integer])
    Mix.Task.run("app.start")

    if opts[:stale] && is_nil(Process.whereis(Bandera.Usage)) do
      Mix.shell().info(
        "[bandera] warning: Bandera.Usage is not running; all flags will appear stale."
      )
    end

    if opts[:stale] do
      Bandera.stale_flags(older_than: opts[:older_than] || 30)
    else
      case Bandera.all_flag_names() do
        {:ok, names} -> Enum.reject(names, &segment_flag?/1)
        _ -> []
      end
    end
    |> Enum.each(&Mix.shell().info(to_string(&1)))
  end

  defp segment_flag?(name), do: String.starts_with?(to_string(name), @segment_prefix)
end