Current section

Files

Jump to
telemetry src telemetry_pt.erl
Raw

src/telemetry_pt.erl

-module(telemetry_pt).
-include("telemetry.hrl").
-export([persist/1,
list_for_event/2,
list_by_prefix/2,
insert/5,
delete/2]).
persist(_Map) -> error.
list_for_event(Map, EventName) ->
case Map of
#{EventName := Handlers} -> Handlers;
_ -> []
end.
list_by_prefix(Map, EventPrefix) ->
[Handler ||
{EventName, Handlers} <- maps:to_list(Map),
starts_with(EventName, EventPrefix),
Handler <- Handlers].
starts_with(_Haystack, []) -> true;
starts_with([A | Haystack], [A | Needle]) -> starts_with(Haystack, Needle);
starts_with(_Haystack, _Needle) -> false.
insert(Map, _HandlerId, [], _Function, _Config) ->
{ok, Map};
insert(Map, HandlerId, [EventName | Rest], Function, Config) ->
OldHandlers = maps:get(EventName, Map, []),
case OldHandlers of
#{HandlerId := _} ->
{error, already_exists};
_ ->
Handler = #handler{id=HandlerId,
event_name=EventName,
function=Function,
config=Config},
case put_new(Handler, OldHandlers) of
{ok, NewHandlers} ->
NewMap = Map#{EventName => NewHandlers},
insert(NewMap, HandlerId, Rest, Function, Config);
{error, _} = Error ->
Error
end
end.
put_new(Handler, List) ->
case lists:keymember(Handler#handler.id, #handler.id, List) of
true -> {error, already_exists};
false -> {ok, [Handler | List]}
end.
delete(Map, HandlerId) ->
Filtered = [{Event, lists:keydelete(HandlerId, #handler.id, Handlers)}
|| {Event, Handlers} <- maps:to_list(Map)],
NewMap = maps:from_list(Filtered),
case NewMap =:= Map of
true -> {error, not_found};
false -> {ok, NewMap}
end.