package lightstep import ( "errors" "github.com/opentracing/opentracing-go" ) // PropagatorStack provides a Propagator interface that supports // multiple propagators per format. type PropagatorStack struct { propagators []Propagator } // PushPropagator adds a Propagator to a list of configured propagators func (stack *PropagatorStack) PushPropagator(p Propagator) { stack.propagators = append(stack.propagators, p) } // Inject iterates through configured propagators and calls // their Inject functions func (stack PropagatorStack) Inject( spanContext opentracing.SpanContext, opaqueCarrier interface{}, ) error { if len(stack.propagators) == 0 { return errors.New("No valid propagator configured") } for _, propagator := range stack.propagators { propagator.Inject(spanContext, opaqueCarrier) } return nil } // Extract iterates through configured propagators and // returns the first successfully extracted context func (stack PropagatorStack) Extract( opaqueCarrier interface{}, ) (opentracing.SpanContext, error) { if len(stack.propagators) == 0 { return nil, errors.New("No valid propagator configured") } for _, propagator := range stack.propagators { context, err := propagator.Extract(opaqueCarrier) if err == nil { return context, nil } } return nil, errors.New("No valid propagator configured") }