Skip to main content

lib/mix/tasks/ttycast.snapshot.ex

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