#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: <msg>\n`,
// where <msg> 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 extern 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);"; }
