Packages

Parse domain names into component parts using the Public Suffix List

Current section

Files

Jump to
psl src psl@domain.erl
Raw

src/psl@domain.erl

-module(psl@domain).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/psl/domain.gleam").
-export([extract_parts/2]).
-export_type([domain_parts/0, extraction_error/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type domain_parts() :: {domain_parts,
binary(),
binary(),
binary(),
list(binary())}.
-type extraction_error() :: invalid_domain.
-file("src/psl/domain.gleam", 37).
?DOC(" Extract domain parts from hostname and suffix\n").
-spec extract_parts(binary(), binary()) -> {ok, domain_parts()} |
{error, extraction_error()}.
extract_parts(Host, Suffix) ->
Host_labels = gleam@string:split(Host, <<"."/utf8>>),
Suffix_labels = gleam@string:split(Suffix, <<"."/utf8>>),
case erlang:length(Host_labels) =< erlang:length(Suffix_labels) of
true ->
{error, invalid_domain};
false ->
Remaining_count = erlang:length(Host_labels) - erlang:length(
Suffix_labels
),
case Remaining_count of
0 ->
{error, invalid_domain};
_ ->
Remaining = gleam@list:take(Host_labels, Remaining_count),
case lists:reverse(Remaining) of
[] ->
{error, invalid_domain};
[Domain | Rest] ->
Subdomains = lists:reverse(Rest),
{ok,
{domain_parts,
Suffix,
Domain,
gleam@string:join(Subdomains, <<"."/utf8>>),
Subdomains}}
end
end
end.