lib/commandline/cli.ex

alias Helix.Graph

defmodule Commandline.CLI do
  def main(args) do
    options = [switches: [file: :string],aliases: [f: :file]]
    {opts, _, _} = OptionParser.parse(args, options)

    {nodes, _, dspid} = Graph.load_graph(opts[:file], true)
    has_input = Graph.has_live_input?(nodes)
    input_targets = Enum.reduce(nodes, [], fn i, acc ->
      {key, node} = i
      name = key |> List.first()
      IO.inspect(Map.get(node.attrs, "module"))
      if Map.get(node.attrs, "module") == "ConsoleInputModule" do
        acc ++ [name]
      else
        acc
      end
    end)

    get_input(dspid, input_targets)

  end

  def get_input(dspid, input_targets) do

    message = IO.gets("?) ")
    send_input(message, input_targets)
    if Process.alive?(dspid) do
      get_input(dspid, input_targets)
    else
      IO.inspect("Goodbye.")
    end

  end

  def send_input(message, input_targets) do
    Enum.map(input_targets, fn target ->
      target_pid = :ets.lookup(:pids, target) |> Enum.at(0) |> elem(1)
      event = %{
        type: :text,
        value: message,
        source_id: "You:" <> target,
        message_id: UUID.uuid4(),
        timestamp: :os.system_time(:milli_seconds)
      }
      GenServer.cast(target_pid, {:convey, event})
    end)
  end

end