lib/mix/tasks/lockstep.dump_trace.ex

defmodule Mix.Tasks.Lockstep.DumpTrace do
  @moduledoc """
  Dump a saved Lockstep trace as a raw Elixir term. Useful for grepping or
  feeding into another tool.

  ## Usage

      mix lockstep.dump_trace --trace traces/foo.lockstep
      mix lockstep.dump_trace --trace traces/foo.lockstep --format inspect
      mix lockstep.dump_trace --trace traces/foo.lockstep --format raw
  """

  use Mix.Task

  @shortdoc "Dump a saved Lockstep trace as raw data"

  @impl true
  def run(args) do
    {opts, _, _} =
      OptionParser.parse(args,
        strict: [trace: :string, format: :string],
        aliases: [t: :trace, f: :format]
      )

    path = Keyword.get(opts, :trace) || Mix.raise("--trace <path> is required")
    format = Keyword.get(opts, :format, "inspect")

    payload = Lockstep.Trace.load(path)

    case format do
      "inspect" ->
        IO.puts(inspect(payload, pretty: true, limit: :infinity, printable_limit: :infinity))

      "raw" ->
        IO.write(:erlang.term_to_binary(payload))

      "events" ->
        Enum.each(Map.get(payload, :trace, []), fn entry ->
          IO.puts(inspect(entry))
        end)

      other ->
        Mix.raise("unknown --format #{inspect(other)}; use inspect | raw | events")
    end
  end
end