defmodule Doumi.Port.Python do
@type name() :: Doumi.Port.name()
@type instance() :: Doumi.Port.instance()
@type start_result() :: Doumi.Port.start_result()
@behaviour Doumi.Port
alias Doumi.Port.Util
@impl Doumi.Port
@spec start(opts :: list()) :: start_result()
def start(opts \\ []) when is_list(opts) do
:python.start(Util.convert_options(opts))
end
@impl Doumi.Port
@spec start(name :: name(), opts :: list()) :: start_result()
def start(name, opts) when is_list(opts) do
:python.start(maybe_wrap_local_name(name), Util.convert_options(opts))
end
@impl Doumi.Port
@spec start_link(opts :: list()) :: start_result()
def start_link(opts \\ []) when is_list(opts) do
:python.start_link(Util.convert_options(opts))
end
@impl Doumi.Port
@spec start_link(name :: name(), opts :: list()) :: start_result()
def start_link(name, opts) when is_list(opts) do
:python.start_link(maybe_wrap_local_name(name), Util.convert_options(opts))
end
@impl Doumi.Port
@spec stop(instance :: instance()) :: :ok
def stop(instance) do
:python.stop(instance)
end
@impl Doumi.Port
@spec call(
instance :: instance(),
module :: atom(),
fun :: atom(),
args :: list(),
opts :: list()
) :: term()
def call(instance, module, fun, args, opts \\ [])
when is_atom(module) and is_atom(fun) and is_list(args) and is_list(opts) do
:python.call(instance, module, fun, args, Util.convert_options(opts))
end
defp maybe_wrap_local_name(name) when is_atom(name), do: {:local, name}
defp maybe_wrap_local_name(name), do: name
end