suitepad-gmbh / pipette

Flow-Based Programming framework for Elixir
MIT License
21 stars 3 forks source link

Need to use an IP for starting a Recipe using the client #9

Closed spieker closed 6 years ago

spieker commented 6 years ago

The client methods push and call currently taking a value and wrapping it inside an IP, also if the value already is an IP. In case of call, the reply_to: field is set an the new IP as well.

@Overbryd Instead of changing the signatures of the client functions, what do you think about removing the IP.update function and have the IP.new function take care of updating as well, depending on the input. The signature of IP.new would then look like this:

IP.new(%IP{} = ip, {route, value}) when is_atom(route)
IP.new(%IP{} = ip, opts) when is_list(opts)
IP.new(%IP{} = ip, value)
IP.new(%IP{} = ip, {route, value}, opts) when is_atom(route) && is_list(opts)
IP.new(%IP{} = ip, value, opts) when is_list(opts)
IP.new({route, value}) when is_atom(route)
IP.new(value)
IP.new({route, value}, opts) when is_atom(route) && is_list(opts)
IP.new(value, opts) when is_list(opts)
Overbryd commented 6 years ago

I think we can extend Pipette.Client to accept two different inputs on push/3 for example:

  def push(pid, %IP{} = ip, opts \\ []) do
    GenServer.call(pid, {:push, ip, opts})
  end

  def push(pid, value, opts \\ []) do
    GenServer.call(pid, {:push, IP.new(value), opts})
  end
Overbryd commented 6 years ago

And about changing IP.new to also handle IP.update, I would argue to keep the method signature of IP.new and IP.update small and separate.

It might be much easier to comprehend and read the documentation when those are two separate functions on IP.

Other elements in Elixir handle it the same way, so that Map.new and Map.put are distinct.

spieker commented 6 years ago

👍