use fmt; export type failed = !void; export type level = enum u8 { ERROR, WARN, INFO, DEBUG, TRACE, }; export type context = struct { fmt: str, fields: []fmt::field, next: nullable *context, }; export type tracer = struct { log: *logfunc, }; export type logfunc = fn( tr: *tracer, ctx: nullable *context, lvl: level, fmt: str, fields: fmt::field... ) void; export fn log( tr: *tracer, ctx: nullable *context, lvl: level, fmt: str, fields: fmt::field... ) void = { tr.log(tr, ctx, lvl, fmt, fields...); }; export fn error(tr: *tracer, fmt: str, fields: fmt::field...) failed = { log(tr, null, level::ERROR, fmt, fields...); return failed; }; export fn warn(tr :*tracer, fmt: str, fields: fmt::field...) void = { log(tr, null, level::WARN, fmt, fields...); }; export fn info(tr: *tracer, fmt: str, fields: fmt::field...) void = { log(tr, null, level::INFO, fmt, fields...); }; export fn debug(tr: *tracer, fmt: str, fields: fmt::field...) void = { log(tr, null, level::DEBUG, fmt, fields...); }; export fn trace(tr: *tracer, fmt: str, fields: fmt::field...) void = { log(tr, null, level::TRACE, fmt, fields...); };