package brave.propagation; import com.google.auto.value.AutoValue; import javax.annotation.Nullable; /** * Union type that contains either a trace context or sampling flags, but not both. * * <p>This is a port of {@code com.github.kristofa.brave.TraceData}, which served the same purpose. * * @see TraceContext.Extractor */ @AutoValue public abstract class TraceContextOrSamplingFlags { /** When present, create the span via {@link brave.Tracer#joinSpan(TraceContext)} */ @Nullable public abstract TraceContext context(); /** When present, create the span via {@link brave.Tracer#newTrace(SamplingFlags)} */ @Nullable public abstract SamplingFlags samplingFlags(); public static TraceContextOrSamplingFlags create(SamplingFlags flags) { return new AutoValue_TraceContextOrSamplingFlags(null, flags); } public static TraceContextOrSamplingFlags create(TraceContext context) { return new AutoValue_TraceContextOrSamplingFlags(context, null); } public static TraceContextOrSamplingFlags create(TraceContext.Builder builder) { if (builder == null) throw new NullPointerException("builder == null"); try { return new AutoValue_TraceContextOrSamplingFlags(builder.build(), null); } catch (IllegalStateException e) { // no trace IDs, but it might have sampling flags SamplingFlags flags = new SamplingFlags.Builder() .sampled(builder.sampled()) .debug(builder.debug()).build(); return new AutoValue_TraceContextOrSamplingFlags(null, flags); } } TraceContextOrSamplingFlags() { // no external implementations } }