Current section
Files
Jump to
Current section
Files
src/barnacle@dns.erl
-module(barnacle@dns).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([dns_lookup/2, discover_nodes/3]).
-export_type([lookup_error/0, ip_address/0]).
-type lookup_error() :: format_error |
query_format_error |
server_failure |
no_such_domain |
timeout |
not_implemented |
refused |
bad_version |
{posix_error, binary()} |
unknown.
-type ip_address() :: {ip_v4, integer(), integer(), integer(), integer()} |
{ip_v6,
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()}.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle/dns.gleam", 40).
-spec dns_lookup(binary(), integer()) -> {ok, list(ip_address())} |
{error, lookup_error()}.
dns_lookup(Hostname, Timeout) ->
gleam@result:'try'(
barnacle_ffi:lookup_a(Hostname, Timeout),
fun(A_records) ->
A_records@1 = begin
_pipe = A_records,
gleam@list:map(
_pipe,
fun(Ip) ->
{A, B, C, D} = Ip,
{ip_v4, A, B, C, D}
end
)
end,
gleam@result:'try'(
barnacle_ffi:lookup_aaaa(Hostname, Timeout),
fun(Aaaa_records) ->
Aaaa_records@1 = begin
_pipe@1 = Aaaa_records,
gleam@list:map(
_pipe@1,
fun(Ip@1) ->
{A@1, B@1, C@1, D@1, E, F, G, H} = Ip@1,
{ip_v6, A@1, B@1, C@1, D@1, E, F, G, H}
end
)
end,
{ok, gleam@list:concat([A_records@1, Aaaa_records@1])}
end
)
end
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle/dns.gleam", 65).
-spec format_ip_address(ip_address()) -> binary().
format_ip_address(Ip) ->
case Ip of
{ip_v4, A, B, C, D} ->
_pipe = [A, B, C, D],
_pipe@1 = gleam@list:map(_pipe, fun gleam@int:to_string/1),
gleam@string:join(_pipe@1, <<"."/utf8>>);
{ip_v6, A@1, B@1, C@1, D@1, E, F, G, H} ->
_pipe@2 = [A@1, B@1, C@1, D@1, E, F, G, H],
_pipe@3 = gleam@list:map(_pipe@2, fun(Value) -> case Value of
0 ->
<<""/utf8>>;
_ ->
gleam@int:to_base16(Value)
end end),
_pipe@4 = gleam@string:join(_pipe@3, <<":"/utf8>>),
gleam@string:lowercase(_pipe@4)
end.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle/dns.gleam", 92).
-spec discover_nodes(binary(), binary(), integer()) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error, lookup_error()}.
discover_nodes(Basename, Hostname_query, Timeout) ->
gleam@result:'try'(
dns_lookup(Hostname_query, Timeout),
fun(Ip_addresses) -> _pipe = Ip_addresses,
_pipe@2 = gleam@list:map(
_pipe,
fun(Ip) ->
Ip_string = format_ip_address(Ip),
_pipe@1 = (<<<<Basename/binary, "@"/utf8>>/binary,
Ip_string/binary>>),
erlang:binary_to_atom(_pipe@1)
end
),
{ok, _pipe@2} end
).