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