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