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 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