#import "modules/std.sx"; // ===================================================================== // log.sx — plain leveled logging (ERR step E4.1), orthogonal to the // error channel. Each entry is written to stderr as `LEVEL: \n`, // where is the formatted `fmt` + args (same `{}` interpolation as // `print`). Sink is stderr (fd 2) so log output stays out of a program's // stdout data stream. // // Note: PLAN-ERR §log sketches a `LEVEL ts msg` line with an ISO-8601 // UTC timestamp. The timestamp is deferred — it needs a clock binding // and would make golden tests time-dependent; the level + message are // the load-bearing parts. Add `ts` once a pinnable clock lands. // ===================================================================== libc :: #library "c"; write :: (fd: i32, buf: [*]u8, count: usize) -> isize #foreign libc; // Prefix the level, append a newline, write the whole line to stderr. log_emit :: (level: string, msg: string) { line := concat(concat(level, msg), "\n"); write(2, line.ptr, xx line.len); } warn :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"WARN: \", result);"; } info :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"INFO: \", result);"; } debug :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"DEBUG: \", result);"; } err :: ($fmt: string, ..$args) { #insert build_format(fmt); #insert "log_emit(\"ERROR: \", result);"; }