improvement: Add IP.Address.to_tuple/1
.
This commit is contained in:
parent
2454740621
commit
13bf9cb6a3
1 changed files with 39 additions and 22 deletions
|
@ -289,6 +289,42 @@ defmodule IP.Address do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Convert an `address` into an Erlang-style tuple.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> ~i(192.0.2.1)
|
||||||
|
...> |> IP.Address.to_tuple()
|
||||||
|
{192, 0, 2, 1}
|
||||||
|
|
||||||
|
iex> ~i(2001:db8::1)
|
||||||
|
...> |> IP.Address.to_tuple()
|
||||||
|
{8193, 3512, 0, 0, 0, 0, 0, 1}
|
||||||
|
"""
|
||||||
|
@spec to_tuple(t) :: :socket.in_addr() | :socket.in6_addr()
|
||||||
|
def to_tuple(%Address{version: 4, address: addr}) do
|
||||||
|
a = addr >>> 0x18 &&& 0xFF
|
||||||
|
b = addr >>> 0x10 &&& 0xFF
|
||||||
|
c = addr >>> 0x08 &&& 0xFF
|
||||||
|
d = addr &&& 0xFF
|
||||||
|
|
||||||
|
{a, b, c, d}
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_tuple(%Address{version: 6, address: addr}) do
|
||||||
|
a = addr >>> 0x70 &&& 0xFFFF
|
||||||
|
b = addr >>> 0x60 &&& 0xFFFF
|
||||||
|
c = addr >>> 0x50 &&& 0xFFFF
|
||||||
|
d = addr >>> 0x40 &&& 0xFFFF
|
||||||
|
e = addr >>> 0x30 &&& 0xFFFF
|
||||||
|
f = addr >>> 0x20 &&& 0xFFFF
|
||||||
|
g = addr >>> 0x10 &&& 0xFFFF
|
||||||
|
h = addr &&& 0xFFFF
|
||||||
|
|
||||||
|
{a, b, c, d, e, f, g, h}
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Convert an `address` into a string.
|
Convert an `address` into a string.
|
||||||
|
|
||||||
|
@ -303,28 +339,9 @@ defmodule IP.Address do
|
||||||
"2001:db8::1"
|
"2001:db8::1"
|
||||||
"""
|
"""
|
||||||
@spec to_string(t) :: binary
|
@spec to_string(t) :: binary
|
||||||
def to_string(%Address{version: 4, address: addr}) do
|
def to_string(address) do
|
||||||
a = addr >>> 0x18 &&& 0xFF
|
address
|
||||||
b = addr >>> 0x10 &&& 0xFF
|
|> to_tuple()
|
||||||
c = addr >>> 0x08 &&& 0xFF
|
|
||||||
d = addr &&& 0xFF
|
|
||||||
|
|
||||||
{a, b, c, d}
|
|
||||||
|> :inet.ntoa()
|
|
||||||
|> List.to_string()
|
|
||||||
end
|
|
||||||
|
|
||||||
def to_string(%Address{version: 6, address: addr}) do
|
|
||||||
a = addr >>> 0x70 &&& 0xFFFF
|
|
||||||
b = addr >>> 0x60 &&& 0xFFFF
|
|
||||||
c = addr >>> 0x50 &&& 0xFFFF
|
|
||||||
d = addr >>> 0x40 &&& 0xFFFF
|
|
||||||
e = addr >>> 0x30 &&& 0xFFFF
|
|
||||||
f = addr >>> 0x20 &&& 0xFFFF
|
|
||||||
g = addr >>> 0x10 &&& 0xFFFF
|
|
||||||
h = addr &&& 0xFFFF
|
|
||||||
|
|
||||||
{a, b, c, d, e, f, g, h}
|
|
||||||
|> :inet.ntoa()
|
|> :inet.ntoa()
|
||||||
|> List.to_string()
|
|> List.to_string()
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue