| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // Copyright The OpenTelemetry Authors
- // SPDX-License-Identifier: Apache-2.0
- package baggage // import "go.opentelemetry.io/otel/internal/baggage"
- import "context"
- type baggageContextKeyType int
- const baggageKey baggageContextKeyType = iota
- // SetHookFunc is a callback called when storing baggage in the context.
- type SetHookFunc func(context.Context, List) context.Context
- // GetHookFunc is a callback called when getting baggage from the context.
- type GetHookFunc func(context.Context, List) List
- type baggageState struct {
- list List
- setHook SetHookFunc
- getHook GetHookFunc
- }
- // ContextWithSetHook returns a copy of parent with hook configured to be
- // invoked every time ContextWithBaggage is called.
- //
- // Passing nil SetHookFunc creates a context with no set hook to call.
- func ContextWithSetHook(parent context.Context, hook SetHookFunc) context.Context {
- var s baggageState
- if v, ok := parent.Value(baggageKey).(baggageState); ok {
- s = v
- }
- s.setHook = hook
- return context.WithValue(parent, baggageKey, s)
- }
- // ContextWithGetHook returns a copy of parent with hook configured to be
- // invoked every time FromContext is called.
- //
- // Passing nil GetHookFunc creates a context with no get hook to call.
- func ContextWithGetHook(parent context.Context, hook GetHookFunc) context.Context {
- var s baggageState
- if v, ok := parent.Value(baggageKey).(baggageState); ok {
- s = v
- }
- s.getHook = hook
- return context.WithValue(parent, baggageKey, s)
- }
- // ContextWithList returns a copy of parent with baggage. Passing nil list
- // returns a context without any baggage.
- func ContextWithList(parent context.Context, list List) context.Context {
- var s baggageState
- if v, ok := parent.Value(baggageKey).(baggageState); ok {
- s = v
- }
- s.list = list
- ctx := context.WithValue(parent, baggageKey, s)
- if s.setHook != nil {
- ctx = s.setHook(ctx, list)
- }
- return ctx
- }
- // ListFromContext returns the baggage contained in ctx.
- func ListFromContext(ctx context.Context) List {
- switch v := ctx.Value(baggageKey).(type) {
- case baggageState:
- if v.getHook != nil {
- return v.getHook(ctx, v.list)
- }
- return v.list
- default:
- return nil
- }
- }
|