-module(gg_cn@internal@class_map).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gg_cn/internal/class_map.gleam").
-export([build/1, get_class_group_id/2, get_conflicting_class_group_ids/3]).
-export_type([class_part/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 class_part() :: {class_part,
gleam@dict:dict(binary(), class_part()),
list({binary(), fun((binary()) -> boolean())}),
gleam@option:option(binary())}.
-file("src/gg_cn/internal/class_map.gleam", 26).
?DOC(false).
-spec empty() -> class_part().
empty() ->
{class_part, maps:new(), [], none}.
-file("src/gg_cn/internal/class_map.gleam", 79).
?DOC(false).
-spec update_at_path(
class_part(),
list(binary()),
fun((class_part()) -> class_part())
) -> class_part().
update_at_path(Part, Path, Update) ->
case Path of
[] ->
Update(Part);
[Head | Tail] ->
Child = case gleam_stdlib:map_get(erlang:element(2, Part), Head) of
{ok, Node} ->
Node;
{error, _} ->
empty()
end,
Updated = update_at_path(Child, Tail, Update),
{class_part,
gleam@dict:insert(erlang:element(2, Part), Head, Updated),
erlang:element(3, Part),
erlang:element(4, Part)}
end.
-file("src/gg_cn/internal/class_map.gleam", 48).
?DOC(false).
-spec process_def(
gg_cn@internal@config:class_def(),
class_part(),
binary(),
gleam@dict:dict(binary(), list(gg_cn@internal@config:class_def()))
) -> class_part().
process_def(Def, Part, Group_id, Theme) ->
case Def of
{lit, <<""/utf8>>} ->
{class_part,
erlang:element(2, Part),
erlang:element(3, Part),
{some, Group_id}};
{lit, Literal} ->
update_at_path(
Part,
gleam@string:split(Literal, <<"-"/utf8>>),
fun(Node) ->
{class_part,
erlang:element(2, Node),
erlang:element(3, Node),
{some, Group_id}}
end
);
{theme, Key} ->
Resolved = begin
_pipe = gleam_stdlib:map_get(Theme, Key),
gleam@result:unwrap(_pipe, [])
end,
process_defs(Resolved, Part, Group_id, Theme);
{val, Validator} ->
{class_part,
erlang:element(2, Part),
lists:append(erlang:element(3, Part), [{Group_id, Validator}]),
erlang:element(4, Part)};
{obj, Entries} ->
gleam@list:fold(
Entries,
Part,
fun(Acc, Entry) ->
{Key@1, Child_defs} = Entry,
update_at_path(
Acc,
gleam@string:split(Key@1, <<"-"/utf8>>),
fun(Node@1) ->
process_defs(Child_defs, Node@1, Group_id, Theme)
end
)
end
)
end.
-file("src/gg_cn/internal/class_map.gleam", 39).
?DOC(false).
-spec process_defs(
list(gg_cn@internal@config:class_def()),
class_part(),
binary(),
gleam@dict:dict(binary(), list(gg_cn@internal@config:class_def()))
) -> class_part().
process_defs(Defs, Part, Group_id, Theme) ->
gleam@list:fold(
Defs,
Part,
fun(Acc, Def) -> process_def(Def, Acc, Group_id, Theme) end
).
-file("src/gg_cn/internal/class_map.gleam", 32).
?DOC(false).
-spec build(gg_cn@internal@config:config()) -> class_part().
build(Cfg) ->
gleam@list:fold(
erlang:element(3, Cfg),
empty(),
fun(Part, Group) ->
{Group_id, Defs} = Group,
process_defs(Defs, Part, Group_id, erlang:element(2, Cfg))
end
).
-file("src/gg_cn/internal/class_map.gleam", 151).
?DOC(false).
-spec find_validator(list({binary(), fun((binary()) -> boolean())}), binary()) -> gleam@option:option(binary()).
find_validator(Validators, Class_rest) ->
case Validators of
[] ->
none;
[{Group_id, Validator} | Rest] ->
case Validator(Class_rest) of
true ->
{some, Group_id};
false ->
find_validator(Rest, Class_rest)
end
end.
-file("src/gg_cn/internal/class_map.gleam", 131).
?DOC(false).
-spec get_group_recursive(list(binary()), class_part()) -> gleam@option:option(binary()).
get_group_recursive(Parts, Part) ->
case Parts of
[] ->
erlang:element(4, Part);
[Head | Tail] ->
From_next = case gleam_stdlib:map_get(erlang:element(2, Part), Head) of
{ok, Child} ->
get_group_recursive(Tail, Child);
{error, _} ->
none
end,
case From_next of
{some, _} ->
From_next;
none ->
case erlang:element(3, Part) of
[] ->
none;
Validators ->
find_validator(
Validators,
gleam@string:join(Parts, <<"-"/utf8>>)
)
end
end
end.
-file("src/gg_cn/internal/class_map.gleam", 119).
?DOC(false).
-spec arbitrary_property_group_id(binary()) -> gleam@option:option(binary()).
arbitrary_property_group_id(Class_name) ->
Content = gleam@string:slice(Class_name, 1, string:length(Class_name) - 2),
case gleam@string:split_once(Content, <<":"/utf8>>) of
{ok, {Property, _}} ->
case Property of
<<""/utf8>> ->
none;
_ ->
{some, <<"arbitrary.."/utf8, Property/binary>>}
end;
{error, _} ->
none
end.
-file("src/gg_cn/internal/class_map.gleam", 99).
?DOC(false).
-spec get_class_group_id(class_part(), binary()) -> gleam@option:option(binary()).
get_class_group_id(Class_map, Class_name) ->
case gleam_stdlib:string_starts_with(Class_name, <<"["/utf8>>) andalso gleam_stdlib:string_ends_with(
Class_name,
<<"]"/utf8>>
) of
true ->
arbitrary_property_group_id(Class_name);
false ->
Parts = gleam@string:split(Class_name, <<"-"/utf8>>),
Parts@1 = case Parts of
[<<""/utf8>>, _ | _] ->
gleam@list:drop(Parts, 1);
_ ->
Parts
end,
get_group_recursive(Parts@1, Class_map)
end.
-file("src/gg_cn/internal/class_map.gleam", 165).
?DOC(false).
-spec get_conflicting_class_group_ids(
gg_cn@internal@config:config(),
binary(),
boolean()
) -> list(binary()).
get_conflicting_class_group_ids(Cfg, Class_group_id, Has_postfix_modifier) ->
case Has_postfix_modifier of
true ->
Base = gleam_stdlib:map_get(erlang:element(4, Cfg), Class_group_id),
case gleam_stdlib:map_get(erlang:element(5, Cfg), Class_group_id) of
{ok, Modifier_conflicts} ->
case Base of
{ok, Base_conflicts} ->
lists:append(Base_conflicts, Modifier_conflicts);
{error, _} ->
Modifier_conflicts
end;
{error, _} ->
gleam@result:unwrap(Base, [])
end;
false ->
gleam@result:unwrap(
gleam_stdlib:map_get(erlang:element(4, Cfg), Class_group_id),
[]
)
end.