package tracing

import "context"

// NopTracerProvider is a no-op tracing implementation.
type NopTracerProvider struct{}

var _ TracerProvider = (*NopTracerProvider)(nil)

// Tracer returns a tracer which creates no-op spans.
func (NopTracerProvider) Tracer(string, ...TracerOption) Tracer {
	return nopTracer{}
}

type nopTracer struct{}

var _ Tracer = (*nopTracer)(nil)

func (nopTracer) StartSpan(ctx context.Context, name string, opts ...SpanOption) (context.Context, Span) {
	return ctx, nopSpan{}
}

type nopSpan struct{}

var _ Span = (*nopSpan)(nil)

func (nopSpan) Name() string                    { return "" }
func (nopSpan) Context() SpanContext            { return SpanContext{} }
func (nopSpan) AddEvent(string, ...EventOption) {}
func (nopSpan) SetProperty(any, any)            {}
func (nopSpan) SetStatus(SpanStatus)            {}
func (nopSpan) End()                            {}