defmodule Mix.Tasks.Ttycast.Snapshot do
@moduledoc """
Print a terminal snapshot from a recording.
mix ttycast.snapshot /tmp/demo.ttycast --time-ms 1000
"""
use Mix.Task
@shortdoc "Print a .ttycast terminal snapshot"
@impl true
def run(argv) do
{opts, args, invalid} =
OptionParser.parse(argv,
strict: [time_ms: :integer, format: :string],
aliases: [t: :time_ms]
)
if invalid != [] or length(args) != 1 do
Mix.raise("usage: mix ttycast.snapshot PATH [--time-ms MS] [--format plain|html|vt]")
end
[path] = args
format = opts |> Keyword.get(:format, "plain") |> String.to_existing_atom()
snapshot_opts = [format: format] |> put_if_present(:time_ms, opts[:time_ms])
path
|> TTYCast.snapshot!(snapshot_opts)
|> IO.write()
end
defp put_if_present(opts, _key, nil), do: opts
defp put_if_present(opts, key, value), do: Keyword.put(opts, key, value)
end