1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>
use fmt;
use io;
use time::date;
// Interface for implementing a logger.
export type logger = struct {
println: *fn(logger: *logger, fields: fmt::formattable...) void,
printfln: *fn(logger: *logger, fmt: str, fields: fmt::field...) void,
};
export type stdlogger = struct {
logger,
sink: io::handle,
};
// Creates a new standard logger.
export fn new(sink: io::handle) stdlogger = {
return stdlogger {
println = &log_println,
printfln = &log_printfln,
sink = sink,
};
};
fn log_println(sink: *logger, fields: fmt::formattable...) void = {
const sink = sink: *stdlogger;
assert(sink.println == &log_println);
const now = date::localnow();
_ = fmt::fprint(sink.sink, "[");
_ = date::format(sink.sink, date::STAMP, &now);
_ = fmt::fprint(sink.sink, "] ");
_ = fmt::fprintln(sink.sink, fields...);
};
fn log_printfln(sink: *logger, fmt: str, fields: fmt::field...) void = {
const sink = sink: *stdlogger;
assert(sink.printfln == &log_printfln);
const now = date::localnow();
_ = fmt::fprint(sink.sink, "[");
_ = date::format(sink.sink, date::STAMP, &now);
_ = fmt::fprint(sink.sink, "] ");
_ = fmt::fprintfln(sink.sink, fmt, fields...);
};
|