
Console.pudu
Pudu64 lines2.5 KB
1/** @Log.Sinks.Console.Sink — events written to the terminal */2module PuduLangLog.Sinks.Console34import Std.Out as Out5import Std.Sync as Sync6import Std.Term as Term7import PuduLangLog.Constants.Names as Names8import PuduLangLog.Domain.Levels as Levels9import PuduLangLog.Domain.Output as Output10import PuduLangLog.Domain.Parser as Parser11import PuduLangLog as Log12import PuduLangLog.Sink as Sink13import PuduLangLog.Sinks.Theme as Theme1415/** @Log.Sinks.Console.Options — layout, colours, and error stream */16export type Options = {17 outputTemplate: Str,18 theme: Theme.Theme,19 colored: Bool,20 standardErrorFromLevel: Option[Log.Level],21 formatter: Option[fn(&Log.Event) -> Str]22}23242526export fn defaults() -> Options {27 Options{outputTemplate: Names.CONSOLE_TEMPLATE, theme: Theme.literate(), colored: Term.colorEnabled(), standardErrorFromLevel: None, formatter: None}28}29303132export fn render(options: &Options, event: &Log.Event) -> Str { textOf(options, &Parser.parse(options.outputTemplate), event) }333435fn textOf(options: &Options, parsed: &Log.Template, event: &Log.Event) -> Str {36 match options.formatter {37 case Some(formatter) => formatter(event)38 case None => Theme.paint(if options.colored { &options.theme } else { &Theme.none() }, &Output.render(parsed, event))39 }40}414243export fn toErrors(options: &Options, level: Log.Level) -> Bool {44 match options.standardErrorFromLevel {45 case Some(minimum) => Levels.passes(level, minimum)46 case None => false47 }48}49505152export fn sink(options: Options) -> Sink.Sink {53 let parsed = Parser.parse(options.outputTemplate)54 let lock = Sync.mutex()55 Sink.of(fn(event: &Log.Event) -> Result[(), Str] {56 let text = textOf(&options, &parsed, event)57 let printer = if toErrors(&options, event.level) { Out.bare().toStream(Out.Errors) } else { Out.bare() }58 match Sync.withLock(&lock, fn() -> Result[(), Str] { Out.text(&printer, text) }) {59 case Ok(written) => written60 case Err(_) => Err("the console lock could not be taken")61 }62 })63}64