defmodule Mix.Tasks.Emulator do
@moduledoc """
Starts the Emulator.
"""
use Mix.Task
@requirements ["app.start"]
@shortdoc "Start the Circlex Emulator."
def run(args) do
opts = parse_args(args)
{:ok, pid} = Circlex.Emulator.start(opts)
Process.link(pid)
:timer.sleep(:infinity)
end
defp parse_args(args), do: do_parse_args(args, [])
defp do_parse_args([], opts), do: opts
defp do_parse_args(["--port", port | rest], opts), do: do_set_port(port, rest, opts)
defp do_parse_args(["-p", port | rest], opts), do: do_set_port(port, rest, opts)
defp do_parse_args(["--load", file | rest], opts), do: do_load_file(file, rest, opts)
defp do_parse_args(["-l", file | rest], opts), do: do_load_file(file, rest, opts)
defp do_parse_args(["--persist", file | rest], opts), do: do_persist_file(file, rest, opts)
defp do_parse_args(["-s", file | rest], opts), do: do_persist_file(file, rest, opts)
defp do_set_port(port, rest, opts) do
{port_int, ""} = Integer.parse(port)
do_parse_args(rest, Keyword.put(opts, :port, port_int))
end
defp do_load_file(file, rest, opts) do
do_parse_args(rest, Keyword.put(opts, :initial_state, {:file, file}))
end
defp do_persist_file(file, rest, opts) do
do_parse_args(rest, Keyword.put(opts, :initial_state, {:persist, file}))
end
end