use fmt; export type ctxtracer = struct { tracer, sink: *tracer, fmt: str, fields: []fmt::field, }; export fn ctx(sink: *tracer, fmt: str, fields: fmt::field...) ctxtracer = { return ctxtracer { log = &ctx_log, sink = sink, fmt = fmt, fields = fields, }; }; fn ctx_log( tr: *tracer, ctx: nullable *context, lvl: level, fmt: str, fields: fmt::field... ) void = { const tr = tr: *ctxtracer; const ctx_ = context { fmt = tr.fmt, fields = tr.fields, next = ctx, }; log(tr.sink, &ctx_, lvl, fmt, fields...); };