hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

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 };