diff options
author | Lassi Pulkkinen <lassi@pulk.fi> | 2024-10-31 03:11:21 +0200 |
---|---|---|
committer | Lassi Pulkkinen <lassi@pulk.fi> | 2024-10-31 03:51:35 +0200 |
commit | ae44478b30d890fe0fb04022f44d474dcdcc3f9d (patch) | |
tree | 5f462459ae4b47d22114eed717d1382d08cf4dfe /trace |
Diffstat (limited to 'trace')
-rw-r--r-- | trace/ctx.ha | 33 | ||||
-rw-r--r-- | trace/root.ha | 21 | ||||
-rw-r--r-- | trace/silent.ha | 15 | ||||
-rw-r--r-- | trace/tee.ha | 26 | ||||
-rw-r--r-- | trace/trace.ha | 60 |
5 files changed, 155 insertions, 0 deletions
diff --git a/trace/ctx.ha b/trace/ctx.ha new file mode 100644 index 0000000..26a1ce6 --- /dev/null +++ b/trace/ctx.ha @@ -0,0 +1,33 @@ +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...); +}; diff --git a/trace/root.ha b/trace/root.ha new file mode 100644 index 0000000..dbae0d1 --- /dev/null +++ b/trace/root.ha @@ -0,0 +1,21 @@ +use fmt; + +export let root = tracer { + log = &root_log, +}; + +let cur_root = &silent; + +export fn setroot(tr: *tracer) void = { + cur_root = tr; +}; + +fn root_log( + tr: *tracer, + ctx: nullable *context, + lvl: level, + fmt: str, + fields: fmt::field... +) void = { + log(cur_root, ctx, lvl, fmt, fields...); +}; diff --git a/trace/silent.ha b/trace/silent.ha new file mode 100644 index 0000000..4fdcde3 --- /dev/null +++ b/trace/silent.ha @@ -0,0 +1,15 @@ +use fmt; + +export const silent = tracer { + log = &silent_log, +}; + +fn silent_log( + tr: *tracer, + ctx: nullable *context, + lvl: level, + fmt: str, + fields: fmt::field... +) void = { + void; +}; diff --git a/trace/tee.ha b/trace/tee.ha new file mode 100644 index 0000000..53bd9ea --- /dev/null +++ b/trace/tee.ha @@ -0,0 +1,26 @@ +use fmt; + +export type teetracer = struct { + tracer, + sinks: []*tracer, +}; + +export fn tee(sinks: *tracer...) teetracer = { + return teetracer { + log = &tee_log, + sinks = sinks, + }; +}; + +export fn tee_log( + tr: *tracer, + ctx: nullable *context, + lvl: level, + fmt: str, + fields: fmt::field... +) void = { + const tr = tr: *teetracer; + for (let i = 0z; i < len(tr.sinks); i += 1) { + log(tr.sinks[i], ctx, lvl, fmt, fields...); + }; +}; diff --git a/trace/trace.ha b/trace/trace.ha new file mode 100644 index 0000000..a096bd3 --- /dev/null +++ b/trace/trace.ha @@ -0,0 +1,60 @@ +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...); +}; |