Current section

Files

Jump to
ex_debug_toolbar lib ex_debug_toolbar breakpoint iex shell.ex
Raw

lib/ex_debug_toolbar/breakpoint/iex/shell.ex

defmodule ExDebugToolbar.Breakpoint.IEx.Shell do
@moduledoc false
@default_cmd """
stty echo
clear
iex -S mix breakpoint.client --breakpoint-file %{breakpoint_file}
"""
alias ExDebugToolbar.Breakpoint
def start(breakpoint) do
with {:ok, _} <- Temp.track,
breakpoint_file <- breakpoint_file(breakpoint),
{:ok, pid, _os_pid} <- start_shell_process(),
:ok <- start_iex_process(pid, breakpoint_file),
do: {:ok, pid}
else error -> error
end
def stop(pid), do: :exec.stop(pid)
def send_input(pid, input), do: :exec.send(pid, input)
defp breakpoint_file(breakpoint) do
serialized_breakpoint = breakpoint |> Breakpoint.serialize!
Temp.open! "breakpoint", &IO.write(&1, serialized_breakpoint)
end
defp start_shell_process do
:exec.run('$SHELL', [:stdin, :stdout, :stderr, :pty])
end
defp start_iex_process(pid, breakpoint_file) do
:ex_debug_toolbar
|> Application.get_env(:iex_shell_cmd, @default_cmd)
|> String.replace("%{breakpoint_file}", breakpoint_file)
|> (&:exec.send(pid, &1)).()
end
end