Current section

Files

Jump to
superls lib password.ex
Raw

lib/password.ex

defmodule Password do
# https://dev.to/tizpuppi/password-input-in-elixir-31oo
# Password prompt that hides input by every 1ms
# clearing the line with stderr
@moduledoc false
def get(prompt) do
pid = spawn_link(fn -> loop(prompt) end)
ref = make_ref()
value = IO.gets("#{prompt} ")
send(pid, {:done, self(), ref})
receive do: ({:done, ^pid, ^ref} -> :ok)
String.trim(value)
end
defp loop(prompt) do
receive do
{:done, parent, ref} ->
send(parent, {:done, self(), ref})
IO.write(:standard_error, "\e[2K\r")
after
1 ->
IO.write(:standard_error, "\e[2K\r#{prompt} ")
loop(prompt)
end
end
end