Skip to main content

src/gg_cn@internal@validators.erl

-module(gg_cn@internal@validators).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gg_cn/internal/validators.gleam").
-export([compile/0, is_number/2, is_integer/2, is_percent/2, is_fraction/2, is_tshirt_size/2, is_any/1, is_arbitrary_variable/2, is_arbitrary_value/2, is_any_non_arbitrary/2, is_arbitrary_size/2, is_arbitrary_length/2, is_arbitrary_number/2, is_arbitrary_weight/2, is_arbitrary_family_name/2, is_arbitrary_position/2, is_arbitrary_image/2, is_arbitrary_shadow/2, is_arbitrary_variable_length/2, is_arbitrary_variable_family_name/2, is_arbitrary_variable_position/2, is_arbitrary_variable_size/2, is_arbitrary_variable_image/2, is_arbitrary_variable_shadow/2, is_arbitrary_variable_weight/2, is_named_container_query/1]).
-export_type([regexes/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.

?MODULEDOC(false).

-type regexes() :: {regexes,
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp(),
        gleam@regexp:regexp()}.

-file("src/gg_cn/internal/validators.gleam", 34).
?DOC(false).
-spec ci(binary()) -> gleam@regexp:regexp().
ci(Pattern) ->
    Re@1 = case gleam@regexp:compile(Pattern, {options, true, false}) of
        {ok, Re} -> Re;
        _assert_fail ->
            erlang:error(#{gleam_error => let_assert,
                        message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                        file => <<?FILEPATH/utf8>>,
                        module => <<"gg_cn/internal/validators"/utf8>>,
                        function => <<"ci"/utf8>>,
                        line => 35,
                        value => _assert_fail,
                        start => 1057,
                        'end' => 1182,
                        pattern_start => 1068,
                        pattern_end => 1074})
    end,
    Re@1.

-file("src/gg_cn/internal/validators.gleam", 43).
?DOC(false).
-spec cs(binary()) -> gleam@regexp:regexp().
cs(Pattern) ->
    Re@1 = case gleam@regexp:compile(Pattern, {options, false, false}) of
        {ok, Re} -> Re;
        _assert_fail ->
            erlang:error(#{gleam_error => let_assert,
                        message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
                        file => <<?FILEPATH/utf8>>,
                        module => <<"gg_cn/internal/validators"/utf8>>,
                        function => <<"cs"/utf8>>,
                        line => 44,
                        value => _assert_fail,
                        start => 1228,
                        'end' => 1354,
                        pattern_start => 1239,
                        pattern_end => 1245})
    end,
    Re@1.

-file("src/gg_cn/internal/validators.gleam", 52).
?DOC(false).
-spec compile() -> regexes().
compile() ->
    {regexes,
        ci(<<"^\\[(?:(\\w[\\w-]*):)?(.+)\\]$"/utf8>>),
        ci(<<"^\\((?:(\\w[\\w-]*):)?(.+)\\)$"/utf8>>),
        cs(<<"^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$"/utf8>>),
        cs(<<"^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$"/utf8>>),
        cs(
            <<"\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$"/utf8>>
        ),
        cs(<<"^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$"/utf8>>),
        cs(
            <<"^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)"/utf8>>
        ),
        cs(
            <<"^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$"/utf8>>
        ),
        cs(<<"^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$"/utf8>>),
        cs(<<"^0[xX][0-9a-fA-F]+$"/utf8>>),
        cs(<<"^0[oO][0-7]+$"/utf8>>),
        cs(<<"^0[bB][01]+$"/utf8>>)}.

-file("src/gg_cn/internal/validators.gleam", 77).
?DOC(false).
-spec first_submatches(gleam@regexp:regexp(), binary()) -> {ok,
        list(gleam@option:option(binary()))} |
    {error, nil}.
first_submatches(Re, Value) ->
    case gleam@regexp:scan(Re, Value) of
        [Match | _] ->
            {ok, erlang:element(3, Match)};

        [] ->
            {error, nil}
    end.

-file("src/gg_cn/internal/validators.gleam", 87).
?DOC(false).
-spec submatch(list(gleam@option:option(binary())), integer()) -> gleam@option:option(binary()).
submatch(Subs, Index) ->
    case gleam@list:drop(Subs, Index) of
        [First | _] ->
            First;

        [] ->
            none
    end.

-file("src/gg_cn/internal/validators.gleam", 96).
?DOC(false).
-spec is_number(regexes(), binary()) -> boolean().
is_number(Rx, Value) ->
    V = gleam@string:trim(Value),
    (V /= <<""/utf8>>) andalso (((gleam@regexp:check(erlang:element(10, Rx), V)
    orelse gleam@regexp:check(erlang:element(11, Rx), V))
    orelse gleam@regexp:check(erlang:element(12, Rx), V))
    orelse gleam@regexp:check(erlang:element(13, Rx), V)).

-file("src/gg_cn/internal/validators.gleam", 112).
?DOC(false).
-spec integral(regexes(), binary()) -> boolean().
integral(Rx, V) ->
    case (gleam@regexp:check(erlang:element(11, Rx), V) orelse gleam@regexp:check(
        erlang:element(12, Rx),
        V
    ))
    orelse gleam@regexp:check(erlang:element(13, Rx), V) of
        true ->
            true;

        false ->
            Unsigned = case gleam_stdlib:string_starts_with(V, <<"+"/utf8>>) of
                true ->
                    gleam@string:drop_start(V, 1);

                false ->
                    V
            end,
            case gleam_stdlib:parse_int(Unsigned) of
                {ok, _} ->
                    true;

                {error, _} ->
                    case gleam_stdlib:parse_float(Unsigned) of
                        {ok, F} ->
                            math:floor(F) =:= F;

                        {error, _} ->
                            false
                    end
            end
    end.

-file("src/gg_cn/internal/validators.gleam", 107).
?DOC(false).
-spec is_integer(regexes(), binary()) -> boolean().
is_integer(Rx, Value) ->
    V = gleam@string:trim(Value),
    is_number(Rx, V) andalso integral(Rx, V).

-file("src/gg_cn/internal/validators.gleam", 136).
?DOC(false).
-spec is_percent(regexes(), binary()) -> boolean().
is_percent(Rx, Value) ->
    gleam_stdlib:string_ends_with(Value, <<"%"/utf8>>) andalso is_number(
        Rx,
        gleam@string:drop_end(Value, 1)
    ).

-file("src/gg_cn/internal/validators.gleam", 140).
?DOC(false).
-spec is_fraction(regexes(), binary()) -> boolean().
is_fraction(Rx, Value) ->
    gleam@regexp:check(erlang:element(4, Rx), Value).

-file("src/gg_cn/internal/validators.gleam", 144).
?DOC(false).
-spec is_tshirt_size(regexes(), binary()) -> boolean().
is_tshirt_size(Rx, Value) ->
    gleam@regexp:check(erlang:element(5, Rx), Value).

-file("src/gg_cn/internal/validators.gleam", 148).
?DOC(false).
-spec is_any(binary()) -> boolean().
is_any(_) ->
    true.

-file("src/gg_cn/internal/validators.gleam", 162).
?DOC(false).
-spec is_arbitrary_variable(regexes(), binary()) -> boolean().
is_arbitrary_variable(Rx, Value) ->
    gleam@regexp:check(erlang:element(3, Rx), Value).

-file("src/gg_cn/internal/validators.gleam", 158).
?DOC(false).
-spec is_arbitrary_value(regexes(), binary()) -> boolean().
is_arbitrary_value(Rx, Value) ->
    gleam@regexp:check(erlang:element(2, Rx), Value).

-file("src/gg_cn/internal/validators.gleam", 152).
?DOC(false).
-spec is_any_non_arbitrary(regexes(), binary()) -> boolean().
is_any_non_arbitrary(Rx, Value) ->
    not is_arbitrary_value(Rx, Value) andalso not is_arbitrary_variable(
        Rx,
        Value
    ).

-file("src/gg_cn/internal/validators.gleam", 166).
?DOC(false).
-spec is_length_only(regexes(), binary()) -> boolean().
is_length_only(Rx, Value) ->
    gleam@regexp:check(erlang:element(6, Rx), Value) andalso not gleam@regexp:check(
        erlang:element(7, Rx),
        Value
    ).

-file("src/gg_cn/internal/validators.gleam", 172).
?DOC(false).
-spec is_shadow(regexes(), binary()) -> boolean().
is_shadow(Rx, Value) ->
    gleam@regexp:check(erlang:element(8, Rx), Value).

-file("src/gg_cn/internal/validators.gleam", 176).
?DOC(false).
-spec is_image(regexes(), binary()) -> boolean().
is_image(Rx, Value) ->
    gleam@regexp:check(erlang:element(9, Rx), Value).

-file("src/gg_cn/internal/validators.gleam", 180).
?DOC(false).
-spec never(binary()) -> boolean().
never(_) ->
    false.

-file("src/gg_cn/internal/validators.gleam", 184).
?DOC(false).
-spec get_is_arbitrary_value(
    regexes(),
    binary(),
    fun((binary()) -> boolean()),
    fun((binary()) -> boolean())
) -> boolean().
get_is_arbitrary_value(Rx, Value, Test_label, Test_value) ->
    case first_submatches(erlang:element(2, Rx), Value) of
        {ok, Subs} ->
            case submatch(Subs, 0) of
                {some, Label} ->
                    Test_label(Label);

                none ->
                    case submatch(Subs, 1) of
                        {some, Inner} ->
                            Test_value(Inner);

                        none ->
                            false
                    end
            end;

        {error, _} ->
            false
    end.

-file("src/gg_cn/internal/validators.gleam", 204).
?DOC(false).
-spec get_is_arbitrary_variable(
    regexes(),
    binary(),
    fun((binary()) -> boolean()),
    boolean()
) -> boolean().
get_is_arbitrary_variable(Rx, Value, Test_label, Should_match_no_label) ->
    case first_submatches(erlang:element(3, Rx), Value) of
        {ok, Subs} ->
            case submatch(Subs, 0) of
                {some, Label} ->
                    Test_label(Label);

                none ->
                    Should_match_no_label
            end;

        {error, _} ->
            false
    end.

-file("src/gg_cn/internal/validators.gleam", 292).
?DOC(false).
-spec is_label_size(binary()) -> boolean().
is_label_size(Label) ->
    ((Label =:= <<"length"/utf8>>) orelse (Label =:= <<"size"/utf8>>)) orelse (Label
    =:= <<"bg-size"/utf8>>).

-file("src/gg_cn/internal/validators.gleam", 220).
?DOC(false).
-spec is_arbitrary_size(regexes(), binary()) -> boolean().
is_arbitrary_size(Rx, Value) ->
    get_is_arbitrary_value(Rx, Value, fun is_label_size/1, fun never/1).

-file("src/gg_cn/internal/validators.gleam", 296).
?DOC(false).
-spec is_label_length(binary()) -> boolean().
is_label_length(Label) ->
    Label =:= <<"length"/utf8>>.

-file("src/gg_cn/internal/validators.gleam", 224).
?DOC(false).
-spec is_arbitrary_length(regexes(), binary()) -> boolean().
is_arbitrary_length(Rx, Value) ->
    get_is_arbitrary_value(
        Rx,
        Value,
        fun is_label_length/1,
        fun(V) -> is_length_only(Rx, V) end
    ).

-file("src/gg_cn/internal/validators.gleam", 300).
?DOC(false).
-spec is_label_number(binary()) -> boolean().
is_label_number(Label) ->
    Label =:= <<"number"/utf8>>.

-file("src/gg_cn/internal/validators.gleam", 230).
?DOC(false).
-spec is_arbitrary_number(regexes(), binary()) -> boolean().
is_arbitrary_number(Rx, Value) ->
    get_is_arbitrary_value(
        Rx,
        Value,
        fun is_label_number/1,
        fun(V) -> is_number(Rx, V) end
    ).

-file("src/gg_cn/internal/validators.gleam", 308).
?DOC(false).
-spec is_label_weight(binary()) -> boolean().
is_label_weight(Label) ->
    (Label =:= <<"number"/utf8>>) orelse (Label =:= <<"weight"/utf8>>).

-file("src/gg_cn/internal/validators.gleam", 234).
?DOC(false).
-spec is_arbitrary_weight(regexes(), binary()) -> boolean().
is_arbitrary_weight(Rx, Value) ->
    get_is_arbitrary_value(Rx, Value, fun is_label_weight/1, fun is_any/1).

-file("src/gg_cn/internal/validators.gleam", 304).
?DOC(false).
-spec is_label_family_name(binary()) -> boolean().
is_label_family_name(Label) ->
    Label =:= <<"family-name"/utf8>>.

-file("src/gg_cn/internal/validators.gleam", 238).
?DOC(false).
-spec is_arbitrary_family_name(regexes(), binary()) -> boolean().
is_arbitrary_family_name(Rx, Value) ->
    get_is_arbitrary_value(Rx, Value, fun is_label_family_name/1, fun never/1).

-file("src/gg_cn/internal/validators.gleam", 284).
?DOC(false).
-spec is_label_position(binary()) -> boolean().
is_label_position(Label) ->
    (Label =:= <<"position"/utf8>>) orelse (Label =:= <<"percentage"/utf8>>).

-file("src/gg_cn/internal/validators.gleam", 242).
?DOC(false).
-spec is_arbitrary_position(regexes(), binary()) -> boolean().
is_arbitrary_position(Rx, Value) ->
    get_is_arbitrary_value(Rx, Value, fun is_label_position/1, fun never/1).

-file("src/gg_cn/internal/validators.gleam", 288).
?DOC(false).
-spec is_label_image(binary()) -> boolean().
is_label_image(Label) ->
    (Label =:= <<"image"/utf8>>) orelse (Label =:= <<"url"/utf8>>).

-file("src/gg_cn/internal/validators.gleam", 246).
?DOC(false).
-spec is_arbitrary_image(regexes(), binary()) -> boolean().
is_arbitrary_image(Rx, Value) ->
    get_is_arbitrary_value(
        Rx,
        Value,
        fun is_label_image/1,
        fun(V) -> is_image(Rx, V) end
    ).

-file("src/gg_cn/internal/validators.gleam", 312).
?DOC(false).
-spec is_label_shadow(binary()) -> boolean().
is_label_shadow(Label) ->
    Label =:= <<"shadow"/utf8>>.

-file("src/gg_cn/internal/validators.gleam", 250).
?DOC(false).
-spec is_arbitrary_shadow(regexes(), binary()) -> boolean().
is_arbitrary_shadow(Rx, Value) ->
    get_is_arbitrary_value(
        Rx,
        Value,
        fun is_label_shadow/1,
        fun(V) -> is_shadow(Rx, V) end
    ).

-file("src/gg_cn/internal/validators.gleam", 254).
?DOC(false).
-spec is_arbitrary_variable_length(regexes(), binary()) -> boolean().
is_arbitrary_variable_length(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_length/1, false).

-file("src/gg_cn/internal/validators.gleam", 258).
?DOC(false).
-spec is_arbitrary_variable_family_name(regexes(), binary()) -> boolean().
is_arbitrary_variable_family_name(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_family_name/1, false).

-file("src/gg_cn/internal/validators.gleam", 262).
?DOC(false).
-spec is_arbitrary_variable_position(regexes(), binary()) -> boolean().
is_arbitrary_variable_position(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_position/1, false).

-file("src/gg_cn/internal/validators.gleam", 266).
?DOC(false).
-spec is_arbitrary_variable_size(regexes(), binary()) -> boolean().
is_arbitrary_variable_size(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_size/1, false).

-file("src/gg_cn/internal/validators.gleam", 270).
?DOC(false).
-spec is_arbitrary_variable_image(regexes(), binary()) -> boolean().
is_arbitrary_variable_image(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_image/1, false).

-file("src/gg_cn/internal/validators.gleam", 274).
?DOC(false).
-spec is_arbitrary_variable_shadow(regexes(), binary()) -> boolean().
is_arbitrary_variable_shadow(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_shadow/1, true).

-file("src/gg_cn/internal/validators.gleam", 278).
?DOC(false).
-spec is_arbitrary_variable_weight(regexes(), binary()) -> boolean().
is_arbitrary_variable_weight(Rx, Value) ->
    get_is_arbitrary_variable(Rx, Value, fun is_label_weight/1, true).

-file("src/gg_cn/internal/validators.gleam", 318).
?DOC(false).
-spec is_named_container_query(binary()) -> boolean().
is_named_container_query(Value) ->
    case gleam_stdlib:string_starts_with(Value, <<"@container"/utf8>>) of
        false ->
            false;

        true ->
            Rest = gleam@string:drop_start(Value, 10),
            N = string:length(Rest),
            Char0 = gleam@string:slice(Rest, 0, 1),
            Char1 = gleam@string:slice(Rest, 1, 1),
            (((Char0 =:= <<"/"/utf8>>) andalso (N > 1)) orelse (((Char1 =:= <<"s"/utf8>>)
            andalso (N > 6))
            andalso gleam_stdlib:string_starts_with(Rest, <<"-size/"/utf8>>)))
            orelse (((Char1 =:= <<"n"/utf8>>) andalso (N > 8)) andalso gleam_stdlib:string_starts_with(
                Rest,
                <<"-normal/"/utf8>>
            ))
    end.