package dkim
import (
	"context"
	"net"
)
type contextKey string
const traceKey contextKey = "trace"
func trace(ctx context.Context, f string, args ...interface{}) {
	traceFunc, ok := ctx.Value(traceKey).(TraceFunc)
	if !ok {
		return
	}
	traceFunc(f, args...)
}
type TraceFunc func(f string, a ...interface{})
func WithTraceFunc(ctx context.Context, trace TraceFunc) context.Context {
	return context.WithValue(ctx, traceKey, trace)
}
const lookupTXTKey contextKey = "lookupTXT"
func lookupTXT(ctx context.Context, domain string) ([]string, error) {
	lookupTXTFunc, ok := ctx.Value(lookupTXTKey).(lookupTXTFunc)
	if !ok {
		return net.LookupTXT(domain)
	}
	return lookupTXTFunc(ctx, domain)
}
type lookupTXTFunc func(ctx context.Context, domain string) ([]string, error)
func WithLookupTXTFunc(ctx context.Context, lookupTXT lookupTXTFunc) context.Context {
	return context.WithValue(ctx, lookupTXTKey, lookupTXT)
}
const maxHeadersKey contextKey = "maxHeaders"
func WithMaxHeaders(ctx context.Context, maxHeaders int) context.Context {
	return context.WithValue(ctx, maxHeadersKey, maxHeaders)
}
func maxHeaders(ctx context.Context) int {
	maxHeaders, ok := ctx.Value(maxHeadersKey).(int)
	if !ok {
		// By default, cap the number of headers to 5 (arbitrarily chosen, may
		// be adjusted in the future).
		return 5
	}
	return maxHeaders
}