blob: d01b0ca9a9d73ccc6c4d7a3d233add3b97ab6293 [file] [log] [blame]
-module(passage_span_context).
-export([make/2]).
-export([get_baggage_items/1]).
-export([set_baggage_items/2]).
-export_type([context/0, maybe_context/0]).
-define(CONTEXT, ?MODULE).
-record(?CONTEXT,
{
state :: term(),
baggage_items = #{} :: passage:baggage_items()
}).
-opaque context() :: #?CONTEXT{}.
-type maybe_context() :: context() | undefined.
-type format() :: text_map | http_header | binary.
-type carrier() :: term().
-type key() :: binary().
-type value() :: binary().
-type inject_fun() :: fun ((key(), value(), carrier()) -> carrier()).
-type extract_fun() :: fun ((carrier()) -> {ok, key(), value(), carrier()} | error).
-callback make_span_context(passage_span:span(), passage:baggage_items()) ->
passage_span_context:context().
-callback inject_span_context(passage_span_context:context(), format(),
carrier(), inject_fun()) -> carrier().
-callback extract_span_context(format(), carrier(), extract_fun()) ->
{ok, passage_span_context:context()} | error.
-spec make(passage_span:span(), passage:baggage_items()) -> context().
make(Span, BaggageItems) ->
State = passage_tracer:make_span_context_state(Span, BaggageItems),
#?CONTEXT{ state = State, baggage_items = BaggageItems }.
-spec get_baggage_items(maybe_context()) -> passage:baggage_items().
get_baggage_items(undefined) -> #{};
get_baggage_items(Context) -> Context#?CONTEXT.baggage_items.
-spec set_baggage_items(maybe_context(), passage:baggage_items()) -> maybe_context().
set_baggage_items(undefined, _BaggageItems) -> undefined;
set_baggage_items(Context, BaggageItems) ->
Merged = maps:merge(Context#?CONTEXT.baggage_items, BaggageItems),
Context#?CONTEXT{baggage_items = Merged}.