%% @doc Shared listen-address option translation.
%%
%% Every adapter accepts the same `ip'/`inet6' listen options; this
%% module turns them into the `[inet6 | {ip, Addr}]' socket option list
%% the wire libraries expect.
-module(livery_inet).
-export([socket_addr_opts/1]).
-doc """
Build inet listen options from the `ip'/`inet6' keys of a listen-opts map.
An IPv6 `ip' tuple (an 8-tuple) or `inet6 => true' selects the `inet6'
family; `ip' sets the bind address. Returns a list suitable for the
`gen_tcp'/`ssl' listen options or quic's `extra_socket_opts'. Returns
`[]' when neither key is set, so callers fall back to default binding.
""".
-spec socket_addr_opts(map()) -> [inet6 | {ip, inet:ip_address()}].
socket_addr_opts(Opts) ->
IP = maps:get(ip, Opts, undefined),
Family =
case {IP, maps:get(inet6, Opts, false)} of
{{_, _, _, _, _, _, _, _}, _} -> [inet6];
{_, true} -> [inet6];
_ -> []
end,
Addr =
case IP of
undefined -> [];
_ -> [{ip, IP}]
end,
Family ++ Addr.