-module(dp_decoder). -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). -endif. -export([recombine_tags/1, to_number/1, to_time/1, protocol/1, parse/2]). -export_type([metric/0, event/0, protocol/0]). -type event() :: #{ type => event, time => pos_integer(), data => maps:map() }. -type metric() :: #{ metric => [binary()], key => [binary()], tags => [{binary(), binary(), binary()}], time => non_neg_integer(), hpts => non_neg_integer(), value => number() }. -type protocol() :: dp_line_proto | dp_multiline_proto. -callback parse(In::binary()) -> {ok, [dp_decoder:metric()] | [dp_decoder:event()]} | {error, term()} | undefined. -callback protocol() -> dp_decoder:protocol(). recombine_tags(Tags) -> [<>, Acc) -> <>; fix_num(<<".", R/binary>>, Acc) -> <>; fix_num(<>, Acc) -> fix_num(R, <>). -ifdef(TEST). to_number_test_() -> [?_assertEqual(to_number(<<"21.12">>), 21.12), ?_assertEqual(to_number(<<"21">>), 21), ?_assertEqual(to_number(<<"1.2e-2">>), 0.012), ?_assertEqual(to_number(<<"12e-2">>), 0.12)]. -endif.