Skip to main content

src/yum@yaml@resolver.erl

-module(yum@yaml@resolver).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/yum/yaml/resolver.gleam").
-export([resolve/2]).
-export_type([resolved_mapping_entry/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 resolved_mapping_entry() :: {resolved_mapping_entry,
        yum@yaml@node:node_(),
        yum@yaml@node:node_(),
        gleam@dict:dict(binary(), yum@yaml@node:node_())}.

-file("src/yum/yaml/resolver.gleam", 434).
?DOC(false).
-spec register_anchor(
    gleam@dict:dict(binary(), yum@yaml@node:node_()),
    yum@yaml@node:node_()
) -> gleam@dict:dict(binary(), yum@yaml@node:node_()).
register_anchor(Anchors, Value) ->
    case yum@yaml@node:anchor(Value) of
        {some, Anchor} ->
            gleam@dict:insert(Anchors, Anchor, Value);

        none ->
            Anchors
    end.

-file("src/yum/yaml/resolver.gleam", 522).
?DOC(false).
-spec copy_alias(yum@yaml@node:node_(), yum@yaml@node:node_()) -> yum@yaml@node:node_().
copy_alias(Value, Source) ->
    case yum@yaml@node:alias(Source) of
        {some, Alias} ->
            yum@yaml@node:with_alias(Value, Alias);

        none ->
            Value
    end.

-file("src/yum/yaml/resolver.gleam", 515).
?DOC(false).
-spec copy_anchor(yum@yaml@node:node_(), yum@yaml@node:node_()) -> yum@yaml@node:node_().
copy_anchor(Value, Source) ->
    case yum@yaml@node:anchor(Source) of
        {some, Anchor} ->
            yum@yaml@node:with_anchor(Value, Anchor);

        none ->
            Value
    end.

-file("src/yum/yaml/resolver.gleam", 508).
?DOC(false).
-spec apply_tag(yum@yaml@node:node_(), gleam@option:option(binary())) -> yum@yaml@node:node_().
apply_tag(Value, Tag) ->
    case Tag of
        {some, Tag@1} ->
            yum@yaml@node:with_tag(Value, Tag@1);

        none ->
            Value
    end.

-file("src/yum/yaml/resolver.gleam", 444).
?DOC(false).
-spec rebuild(yum@yaml@node:node_(), yum@yaml@node:kind()) -> yum@yaml@node:node_().
rebuild(Source, Kind) ->
    _pipe = yum@yaml@node:new(
        Kind,
        yum@yaml@node:span(Source),
        yum@yaml@node:style(Source)
    ),
    _pipe@1 = apply_tag(_pipe, yum@yaml@node:tag(Source)),
    _pipe@2 = copy_anchor(_pipe@1, Source),
    copy_alias(_pipe@2, Source).

-file("src/yum/yaml/resolver.gleam", 543).
?DOC(false).
-spec bool_identity(boolean()) -> binary().
bool_identity(Value) ->
    case Value of
        true ->
            <<"true"/utf8>>;

        false ->
            <<"false"/utf8>>
    end.

-file("src/yum/yaml/resolver.gleam", 529).
?DOC(false).
-spec key_identity(yum@yaml@node:node_()) -> gleam@option:option(binary()).
key_identity(Key) ->
    case yum@yaml@node:kind(Key) of
        null ->
            {some, <<"null:"/utf8>>};

        {bool, Value} ->
            {some, <<"bool:"/utf8, (bool_identity(Value))/binary>>};

        {int, Value@1} ->
            {some, <<"int:"/utf8, (erlang:integer_to_binary(Value@1))/binary>>};

        {float, Value@2} ->
            {some,
                <<"float:"/utf8,
                    (gleam_stdlib:float_to_string(Value@2))/binary>>};

        pos_inf ->
            {some, <<"float:.inf"/utf8>>};

        neg_inf ->
            {some, <<"float:-.inf"/utf8>>};

        nan ->
            {some, <<"float:.nan"/utf8>>};

        {string, Value@3} ->
            {some, <<"string:"/utf8, Value@3/binary>>};

        {sequence, _} ->
            none;

        {mapping, _} ->
            none
    end.

-file("src/yum/yaml/resolver.gleam", 412).
?DOC(false).
-spec seen_key_identities(list({yum@yaml@node:node_(), yum@yaml@node:node_()})) -> gleam@dict:dict(binary(), nil).
seen_key_identities(Entries) ->
    gleam@list:fold(
        Entries,
        maps:new(),
        fun(Seen, Entry) ->
            {Key, _} = Entry,
            case key_identity(Key) of
                none ->
                    Seen;

                {some, Identity} ->
                    gleam@dict:insert(Seen, Identity, nil)
            end
        end
    ).

-file("src/yum/yaml/resolver.gleam", 390).
?DOC(false).
-spec deduplicate_merged_entries(
    list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    gleam@dict:dict(binary(), nil)
) -> list({yum@yaml@node:node_(), yum@yaml@node:node_()}).
deduplicate_merged_entries(Entries, Seen) ->
    {Entries@2, _} = gleam@list:fold(
        Entries,
        {[], Seen},
        fun(Acc, Entry) ->
            {Entries@1, Seen@1} = Acc,
            {Key, _} = Entry,
            case key_identity(Key) of
                none ->
                    {[Entry | Entries@1], Seen@1};

                {some, Identity} ->
                    case gleam@dict:has_key(Seen@1, Identity) of
                        true ->
                            Acc;

                        false ->
                            {[Entry | Entries@1],
                                gleam@dict:insert(Seen@1, Identity, nil)}
                    end
            end
        end
    ),
    lists:reverse(Entries@2).

-file("src/yum/yaml/resolver.gleam", 378).
?DOC(false).
-spec merge_target_entries(yum@yaml@node:node_(), yum@yaml@node:span()) -> {list({yum@yaml@node:node_(),
        yum@yaml@node:node_()}),
    list(yum@yaml@diagnostic:diagnostic())}.
merge_target_entries(Target, Span) ->
    case yum@yaml@node:kind(Target) of
        {mapping, Entries} ->
            {Entries, []};

        _ ->
            {[],
                [{invalid_merge_target, yum@yaml@node:kind_name(Target), Span}]}
    end.

-file("src/yum/yaml/resolver.gleam", 363).
?DOC(false).
-spec expand_merge_sequence_entry(
    yum@yaml@node:node_(),
    gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    list(yum@yaml@diagnostic:diagnostic())}.
expand_merge_sequence_entry(Entry, Anchors) ->
    case yum@yaml@node:alias(Entry) of
        {some, Alias} ->
            case gleam_stdlib:map_get(Anchors, Alias) of
                {ok, Target} ->
                    merge_target_entries(Target, yum@yaml@node:span(Entry));

                {error, _} ->
                    {[], []}
            end;

        none ->
            merge_target_entries(Entry, yum@yaml@node:span(Entry))
    end.

-file("src/yum/yaml/resolver.gleam", 347).
?DOC(false).
-spec expand_merge_sequence(
    list(yum@yaml@node:node_()),
    gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    list(yum@yaml@diagnostic:diagnostic())}.
expand_merge_sequence(Entries, Anchors) ->
    gleam@list:fold(
        Entries,
        {[], []},
        fun(Acc, Entry) ->
            {Merged_entries, Diagnostics} = Acc,
            {Entries@1, Entry_diagnostics} = expand_merge_sequence_entry(
                Entry,
                Anchors
            ),
            {lists:append(Merged_entries, Entries@1),
                lists:append(Diagnostics, Entry_diagnostics)}
        end
    ).

-file("src/yum/yaml/resolver.gleam", 322).
?DOC(false).
-spec expand_merge_value(
    yum@yaml@node:node_(),
    gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    list(yum@yaml@diagnostic:diagnostic())}.
expand_merge_value(Value, Anchors) ->
    case yum@yaml@node:alias(Value) of
        {some, Alias} ->
            case gleam_stdlib:map_get(Anchors, Alias) of
                {ok, Target} ->
                    merge_target_entries(Target, yum@yaml@node:span(Value));

                {error, _} ->
                    {[], []}
            end;

        none ->
            case yum@yaml@node:kind(Value) of
                {mapping, Entries} ->
                    {Entries, []};

                {sequence, Entries@1} ->
                    expand_merge_sequence(Entries@1, Anchors);

                _ ->
                    {[],
                        [{invalid_merge_target,
                                yum@yaml@node:kind_name(Value),
                                yum@yaml@node:span(Value)}]}
            end
    end.

-file("src/yum/yaml/resolver.gleam", 423).
?DOC(false).
-spec is_merge_key(yum@yaml@node:node_()) -> boolean().
is_merge_key(Key) ->
    case yum@yaml@node:tag(Key) of
        {some, <<"tag:yaml.org,2002:merge"/utf8>>} ->
            true;

        _ ->
            case yum@yaml@node:kind(Key) of
                {string, <<"<<"/utf8>>} ->
                    true;

                _ ->
                    false
            end
    end.

-file("src/yum/yaml/resolver.gleam", 285).
?DOC(false).
-spec expand_mapping_merges(list(resolved_mapping_entry())) -> {list({yum@yaml@node:node_(),
        yum@yaml@node:node_()}),
    list(yum@yaml@diagnostic:diagnostic())}.
expand_mapping_merges(Entries) ->
    Explicit_entries = begin
        _pipe = Entries,
        gleam@list:filter_map(
            _pipe,
            fun(Entry) -> case is_merge_key(erlang:element(2, Entry)) of
                    true ->
                        {error, nil};

                    false ->
                        {ok,
                            {erlang:element(2, Entry), erlang:element(3, Entry)}}
                end end
        )
    end,
    {Merged_entries@1, Diagnostics@1} = gleam@list:fold(
        Entries,
        {[], []},
        fun(Acc, Entry@1) ->
            {Merged_entries, Diagnostics} = Acc,
            case is_merge_key(erlang:element(2, Entry@1)) of
                false ->
                    Acc;

                true ->
                    {Entries@1, Entry_diagnostics} = expand_merge_value(
                        erlang:element(3, Entry@1),
                        erlang:element(4, Entry@1)
                    ),
                    {lists:append(Merged_entries, Entries@1),
                        lists:append(Diagnostics, Entry_diagnostics)}
            end
        end
    ),
    Merged_entries@2 = begin
        _pipe@1 = Merged_entries@1,
        deduplicate_merged_entries(
            _pipe@1,
            seen_key_identities(Explicit_entries)
        )
    end,
    {lists:append(Explicit_entries, Merged_entries@2), Diagnostics@1}.

-file("src/yum/yaml/resolver.gleam", 256).
?DOC(false).
-spec resolve_mapping_merges(
    list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    gleam@dict:dict(binary(), yum@yaml@node:node_()),
    list(yum@yaml@diagnostic:diagnostic())}.
resolve_mapping_merges(Entries, Anchors) ->
    {Entries@2, Anchors@4, Diagnostics@1} = gleam@list:fold(
        Entries,
        {[], Anchors, []},
        fun(Acc, Entry) ->
            {Entries@1, Anchors@1, Diagnostics} = Acc,
            {Key, Value} = Entry,
            {Key@1, Anchors@2, Key_diagnostics} = resolve_node_merges(
                Key,
                Anchors@1
            ),
            {Value@1, Anchors@3, Value_diagnostics} = resolve_node_merges(
                Value,
                Anchors@2
            ),
            {[{resolved_mapping_entry, Key@1, Value@1, Anchors@3} | Entries@1],
                Anchors@3,
                begin
                    _pipe = Diagnostics,
                    _pipe@1 = lists:append(_pipe, Key_diagnostics),
                    lists:append(_pipe@1, Value_diagnostics)
                end}
        end
    ),
    {Entries@3, Merge_diagnostics} = begin
        _pipe@2 = Entries@2,
        _pipe@3 = lists:reverse(_pipe@2),
        expand_mapping_merges(_pipe@3)
    end,
    {Entries@3, Anchors@4, lists:append(Diagnostics@1, Merge_diagnostics)}.

-file("src/yum/yaml/resolver.gleam", 236).
?DOC(false).
-spec resolve_sequence_merges(
    list(yum@yaml@node:node_()),
    gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list(yum@yaml@node:node_()),
    gleam@dict:dict(binary(), yum@yaml@node:node_()),
    list(yum@yaml@diagnostic:diagnostic())}.
resolve_sequence_merges(Entries, Anchors) ->
    {Entries@2, Anchors@3, Diagnostics@1} = gleam@list:fold(
        Entries,
        {[], Anchors, []},
        fun(Acc, Entry) ->
            {Entries@1, Anchors@1, Diagnostics} = Acc,
            {Entry@1, Anchors@2, Entry_diagnostics} = resolve_node_merges(
                Entry,
                Anchors@1
            ),
            {[Entry@1 | Entries@1],
                Anchors@2,
                lists:append(Diagnostics, Entry_diagnostics)}
        end
    ),
    {lists:reverse(Entries@2), Anchors@3, Diagnostics@1}.

-file("src/yum/yaml/resolver.gleam", 210).
?DOC(false).
-spec resolve_node_merges(
    yum@yaml@node:node_(),
    gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {yum@yaml@node:node_(),
    gleam@dict:dict(binary(), yum@yaml@node:node_()),
    list(yum@yaml@diagnostic:diagnostic())}.
resolve_node_merges(Value, Anchors) ->
    {Kind@1, Anchors@3, Nested_diagnostics} = case yum@yaml@node:kind(Value) of
        {sequence, Entries} ->
            {Entries@1, Anchors@1, Diagnostics} = resolve_sequence_merges(
                Entries,
                Anchors
            ),
            {{sequence, Entries@1}, Anchors@1, Diagnostics};

        {mapping, Entries@2} ->
            {Entries@3, Anchors@2, Diagnostics@1} = resolve_mapping_merges(
                Entries@2,
                Anchors
            ),
            {{mapping, Entries@3}, Anchors@2, Diagnostics@1};

        Kind ->
            {Kind, Anchors, []}
    end,
    Value@1 = rebuild(Value, Kind@1),
    Anchors@4 = register_anchor(Anchors@3, Value@1),
    {Value@1, Anchors@4, Nested_diagnostics}.

-file("src/yum/yaml/resolver.gleam", 496).
?DOC(false).
-spec expand_tag_handle(
    binary(),
    binary(),
    gleam@dict:dict(binary(), binary()),
    yum@yaml@node:span()
) -> {ok, binary()} | {error, yum@yaml@diagnostic:diagnostic()}.
expand_tag_handle(Handle, Suffix, Handles, Span) ->
    case gleam_stdlib:map_get(Handles, Handle) of
        {ok, Prefix} ->
            {ok, <<Prefix/binary, Suffix/binary>>};

        {error, _} ->
            {error, {unknown_tag_handle, Handle, Span}}
    end.

-file("src/yum/yaml/resolver.gleam", 466).
?DOC(false).
-spec expand_tag(
    binary(),
    gleam@dict:dict(binary(), binary()),
    yum@yaml@node:span()
) -> {ok, binary()} | {error, yum@yaml@diagnostic:diagnostic()}.
expand_tag(Tag, Handles, Span) ->
    case Tag of
        <<"<"/utf8, Verbatim/binary>> ->
            case {gleam_stdlib:string_ends_with(Verbatim, <<">"/utf8>>),
                gleam@string:drop_end(Verbatim, 1)} of
                {true, <<""/utf8>>} ->
                    {error, {invalid_tag, Tag, Span}};

                {true, Uri} ->
                    {ok, Uri};

                {false, _} ->
                    {error, {invalid_tag, Tag, Span}}
            end;

        <<"!"/utf8, Suffix/binary>> ->
            expand_tag_handle(<<"!!"/utf8>>, Suffix, Handles, Span);

        _ ->
            case gleam@string:split(Tag, <<"!"/utf8>>) of
                [] ->
                    expand_tag_handle(<<"!"/utf8>>, Tag, Handles, Span);

                [Suffix@1] ->
                    expand_tag_handle(<<"!"/utf8>>, Suffix@1, Handles, Span);

                [Handle | Suffix@2] ->
                    expand_tag_handle(
                        <<<<"!"/utf8, Handle/binary>>/binary, "!"/utf8>>,
                        gleam@string:join(Suffix@2, <<"!"/utf8>>),
                        Handles,
                        Span
                    )
            end
    end.

-file("src/yum/yaml/resolver.gleam", 451).
?DOC(false).
-spec resolve_tag(
    gleam@option:option(binary()),
    gleam@dict:dict(binary(), binary()),
    yum@yaml@node:span()
) -> {gleam@option:option(binary()), list(yum@yaml@diagnostic:diagnostic())}.
resolve_tag(Tag, Handles, Span) ->
    case Tag of
        none ->
            {none, []};

        {some, Tag@1} ->
            case expand_tag(Tag@1, Handles, Span) of
                {ok, Tag@2} ->
                    {{some, Tag@2}, []};

                {error, Diagnostic} ->
                    {{some, Tag@1}, [Diagnostic]}
            end
    end.

-file("src/yum/yaml/resolver.gleam", 188).
?DOC(false).
-spec resolve_mapping_tags(
    list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    gleam@dict:dict(binary(), binary())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
    list(yum@yaml@diagnostic:diagnostic())}.
resolve_mapping_tags(Entries, Handles) ->
    {Entries@2, Diagnostics@1} = gleam@list:fold(
        Entries,
        {[], []},
        fun(Acc, Entry) ->
            {Entries@1, Diagnostics} = Acc,
            {Key, Value} = Entry,
            {Key@1, Key_diagnostics} = resolve_node_tags(Key, Handles),
            {Value@1, Value_diagnostics} = resolve_node_tags(Value, Handles),
            {[{Key@1, Value@1} | Entries@1],
                begin
                    _pipe = Diagnostics,
                    _pipe@1 = lists:append(_pipe, Key_diagnostics),
                    lists:append(_pipe@1, Value_diagnostics)
                end}
        end
    ),
    {lists:reverse(Entries@2), Diagnostics@1}.

-file("src/yum/yaml/resolver.gleam", 173).
?DOC(false).
-spec resolve_sequence_tags(
    list(yum@yaml@node:node_()),
    gleam@dict:dict(binary(), binary())
) -> {list(yum@yaml@node:node_()), list(yum@yaml@diagnostic:diagnostic())}.
resolve_sequence_tags(Entries, Handles) ->
    {Entries@2, Diagnostics@1} = gleam@list:fold(
        Entries,
        {[], []},
        fun(Acc, Entry) ->
            {Entries@1, Diagnostics} = Acc,
            {Entry@1, Entry_diagnostics} = resolve_node_tags(Entry, Handles),
            {[Entry@1 | Entries@1],
                lists:append(Diagnostics, Entry_diagnostics)}
        end
    ),
    {lists:reverse(Entries@2), Diagnostics@1}.

-file("src/yum/yaml/resolver.gleam", 142).
?DOC(false).
-spec resolve_node_tags(
    yum@yaml@node:node_(),
    gleam@dict:dict(binary(), binary())
) -> {yum@yaml@node:node_(), list(yum@yaml@diagnostic:diagnostic())}.
resolve_node_tags(Value, Handles) ->
    {Kind@1, Nested_diagnostics} = case yum@yaml@node:kind(Value) of
        {sequence, Entries} ->
            {Entries@1, Diagnostics} = resolve_sequence_tags(Entries, Handles),
            {{sequence, Entries@1}, Diagnostics};

        {mapping, Entries@2} ->
            {Entries@3, Diagnostics@1} = resolve_mapping_tags(
                Entries@2,
                Handles
            ),
            {{mapping, Entries@3}, Diagnostics@1};

        Kind ->
            {Kind, []}
    end,
    {Tag, Tag_diagnostics} = begin
        _pipe = yum@yaml@node:tag(Value),
        resolve_tag(_pipe, Handles, yum@yaml@node:span(Value))
    end,
    Resolved = begin
        _pipe@1 = yum@yaml@node:new(
            Kind@1,
            yum@yaml@node:span(Value),
            yum@yaml@node:style(Value)
        ),
        _pipe@2 = apply_tag(_pipe@1, Tag),
        _pipe@3 = copy_anchor(_pipe@2, Value),
        copy_alias(_pipe@3, Value)
    end,
    {Resolved, lists:append(Tag_diagnostics, Nested_diagnostics)}.

-file("src/yum/yaml/resolver.gleam", 134).
?DOC(false).
-spec valid_tag_handle(binary()) -> boolean().
valid_tag_handle(Handle) ->
    case Handle of
        <<"!"/utf8>> ->
            true;

        <<"!!"/utf8>> ->
            true;

        <<"!"/utf8, Rest/binary>> ->
            gleam_stdlib:string_ends_with(Rest, <<"!"/utf8>>) andalso (string:length(
                Rest
            )
            > 1);

        _ ->
            false
    end.

-file("src/yum/yaml/resolver.gleam", 128).
?DOC(false).
-spec default_tag_handles() -> gleam@dict:dict(binary(), binary()).
default_tag_handles() ->
    _pipe = maps:new(),
    _pipe@1 = gleam@dict:insert(_pipe, <<"!"/utf8>>, <<"!"/utf8>>),
    gleam@dict:insert(_pipe@1, <<"!!"/utf8>>, <<"tag:yaml.org,2002:"/utf8>>).

-file("src/yum/yaml/resolver.gleam", 102).
?DOC(false).
-spec tag_handles(list(yum@yaml@document:directive())) -> {gleam@dict:dict(binary(), binary()),
    list(yum@yaml@diagnostic:diagnostic())}.
tag_handles(Directives) ->
    gleam@list:fold(
        Directives,
        {default_tag_handles(), []},
        fun(Acc, Directive) ->
            {Handles, Diagnostics} = Acc,
            case Directive of
                {directive, <<"TAG"/utf8>>, [Handle, Prefix], Span} ->
                    case valid_tag_handle(Handle) of
                        true ->
                            {gleam@dict:insert(Handles, Handle, Prefix),
                                Diagnostics};

                        false ->
                            {Handles,
                                lists:append(
                                    Diagnostics,
                                    [{invalid_tag_directive, Span}]
                                )}
                    end;

                {directive, <<"TAG"/utf8>>, _, Span@1} ->
                    {Handles,
                        lists:append(
                            Diagnostics,
                            [{invalid_tag_directive, Span@1}]
                        )};

                _ ->
                    Acc
            end
        end
    ).

-file("src/yum/yaml/resolver.gleam", 58).
?DOC(false).
-spec validate_yaml_directives(list(yum@yaml@document:directive())) -> list(yum@yaml@diagnostic:diagnostic()).
validate_yaml_directives(Directives) ->
    {_, Diagnostics@1} = gleam@list:fold(
        Directives,
        {none, []},
        fun(Acc, Directive) ->
            {First_yaml, Diagnostics} = Acc,
            case Directive of
                {directive, <<"YAML"/utf8>>, [Version], Span} ->
                    case First_yaml of
                        {some, Original} ->
                            {First_yaml,
                                lists:append(
                                    Diagnostics,
                                    [{duplicate_yaml_directive, Span, Original}]
                                )};

                        none ->
                            case Version of
                                <<"1.2"/utf8>> ->
                                    {{some, Span}, Diagnostics};

                                _ ->
                                    {{some, Span},
                                        lists:append(
                                            Diagnostics,
                                            [{unsupported_yaml_version,
                                                    Version,
                                                    Span}]
                                        )}
                            end
                    end;

                {directive, <<"YAML"/utf8>>, _, Span@1} ->
                    {First_yaml,
                        lists:append(
                            Diagnostics,
                            [{invalid_yaml_directive, Span@1}]
                        )};

                _ ->
                    Acc
            end
        end
    ),
    Diagnostics@1.

-file("src/yum/yaml/resolver.gleam", 25).
?DOC(false).
-spec resolve(yum@yaml@node:node_(), list(yum@yaml@document:directive())) -> {ok,
        {yum@yaml@node:node_(), list(yum@yaml@diagnostic:diagnostic())}} |
    {error, list(yum@yaml@diagnostic:diagnostic())}.
resolve(Root, Directives) ->
    Yaml_directive_diagnostics = begin
        _pipe = Directives,
        validate_yaml_directives(_pipe)
    end,
    {Tag_handles, Directive_diagnostics} = begin
        _pipe@1 = Directives,
        tag_handles(_pipe@1)
    end,
    {Root@1, Tag_diagnostics} = begin
        _pipe@2 = Root,
        resolve_node_tags(_pipe@2, Tag_handles)
    end,
    Property_diagnostics = yum@yaml@diagnostic:collect(Root@1),
    {Root@2, _, Merge_diagnostics} = resolve_node_merges(Root@1, maps:new()),
    Diagnostics = begin
        _pipe@3 = [],
        _pipe@4 = lists:append(_pipe@3, Yaml_directive_diagnostics),
        _pipe@5 = lists:append(_pipe@4, Directive_diagnostics),
        _pipe@6 = lists:append(_pipe@5, Tag_diagnostics),
        _pipe@7 = lists:append(_pipe@6, Property_diagnostics),
        lists:append(_pipe@7, Merge_diagnostics)
    end,
    case yum@yaml@diagnostic:has_errors(Diagnostics) of
        true ->
            {error, Diagnostics};

        false ->
            {ok, {Root@2, Diagnostics}}
    end.