Packages

Effortless XML parsing for Erlang, simple, fast, and neat.

Current section

Files

Jump to
loki_xml src loki_xml_merger.erl
Raw

src/loki_xml_merger.erl

%%%-------------------------------------------------------------------
%%% @doc loki_xml_merger - Merges parsed chunks and handles errors
%%% @end
%%%-------------------------------------------------------------------
-module(loki_xml_merger).
-export([merge/1]).
-type parse_result() :: {ok, [term()]} | {error, term()}.
%%%===================================================================
%%% API Functions
%%%===================================================================
%% @doc Merge results from multiple chunk parsers
-spec merge([parse_result()]) -> {ok, [term()]} | {error, term()}.
merge(Results) ->
{OkResults, Errors} = partition_results(Results),
case {OkResults, Errors} of
{[], []} ->
{ok, []};
{[], Errors} ->
%% All failed
{error, {all_chunks_failed, Errors}};
{OkResults, []} ->
%% All succeeded
{ok, flatten_results(OkResults)};
{OkResults, Errors} ->
%% Partial success - log errors but return successful results
log_errors(Errors),
{ok, flatten_results(OkResults)}
end.
%%%===================================================================
%%% Internal Functions
%%%===================================================================
partition_results(Results) ->
partition_results(Results, [], []).
partition_results([], OkAcc, ErrAcc) ->
{lists:reverse(OkAcc), lists:reverse(ErrAcc)};
partition_results([{ok, Data} | Rest], OkAcc, ErrAcc) ->
partition_results(Rest, [Data | OkAcc], ErrAcc);
partition_results([{error, Reason} | Rest], OkAcc, ErrAcc) ->
partition_results(Rest, OkAcc, [Reason | ErrAcc]);
partition_results([Other | Rest], OkAcc, ErrAcc) ->
%% Handle unexpected results
partition_results(Rest, OkAcc, [{unexpected_result, Other} | ErrAcc]).
flatten_results(Results) ->
lists:flatten(Results).
log_errors([]) ->
ok;
log_errors(Errors) ->
io:format("[loki_xml_merger] Errors encountered during parsing:~n"),
lists:foreach(fun(Error) ->
io:format(" - ~p~n", [Error])
end, Errors),
ok.