defmodule Mix.Tasks.Ttycast.Rec do @moduledoc """ Interactively record a command in the current terminal. mix ttycast.rec --output /tmp/demo.ttycast -- bash """ use Mix.Task @shortdoc "Interactively record a command" @impl true def run(argv) do {opts, command, invalid} = OptionParser.parse(argv, strict: [output: :string, input: :string], aliases: [o: :output] ) if invalid != [] or command == [] do Mix.raise("usage: mix ttycast.rec --output PATH -- COMMAND [ARGS...]") end path = Keyword.get(opts, :output) || Mix.raise("--output is required") record_opts = [path: path, input_policy: input_policy(opts)] case TTYCast.record_interactive(command, record_opts) do {:ok, result} -> Mix.shell().info( "\nrecorded #{result.bytes} bytes to #{result.path}; exit=#{result.status}" ) {:error, reason} -> Mix.raise("recording failed: #{inspect(reason)}") end end defp input_policy(opts) do case Keyword.get(opts, :input, "redacted") do "raw" -> :raw "none" -> :none "redacted" -> :redacted value -> Mix.raise("--input must be raw, redacted, or none; got #{inspect(value)}") end end end