tuwunel_core/log/fmt.rs
1//! HTML and Markdown formatting for captured log events.
2//!
3//! Each helper appends one entry or table header to a caller-provided
4//! formatter. Event entries include tracing level and span context, while the
5//! header helper writes column labels.
6
7use std::fmt::Write;
8
9use super::{Level, color};
10use crate::Result;
11
12/// Appends one captured log event as an HTML line.
13///
14/// The level receives its level-specific Matrix color and each component is
15/// placed in a code element. A line break terminates the rendered entry.
16pub fn html<S>(out: &mut S, level: &Level, span: &str, msg: &str) -> Result
17where
18 S: Write + ?Sized,
19{
20 let color = color::code_tag(level);
21 let level = level.as_str().to_uppercase();
22 write!(
23 out,
24 "<font data-mx-color=\"{color}\"><code>{level:>5}</code></font> <code>{span:^12}</code> \
25 <code>{msg}</code><br>"
26 )?;
27
28 Ok(())
29}
30
31/// Appends one captured log event as a Markdown line.
32///
33/// Level, span, and message are rendered as inline-code columns separated by
34/// spaces. A newline terminates the entry.
35pub fn markdown<S>(out: &mut S, level: &Level, span: &str, msg: &str) -> Result
36where
37 S: Write + ?Sized,
38{
39 let level = level.as_str().to_uppercase();
40 writeln!(out, "`{level:>5}` `{span:^12}` `{msg}`")?;
41
42 Ok(())
43}
44
45/// Appends one captured log event as a Markdown table row.
46///
47/// The level and span receive fixed-width alignment while the message remains
48/// left aligned. A newline terminates the row.
49pub fn markdown_table<S>(out: &mut S, level: &Level, span: &str, msg: &str) -> Result
50where
51 S: Write + ?Sized,
52{
53 let level = level.as_str().to_uppercase();
54 writeln!(out, "| {level:>5} | {span:^12} | {msg} |")?;
55
56 Ok(())
57}
58
59/// Appends the header for a captured-log Markdown table.
60///
61/// The header defines level, span, and message columns together with their
62/// alignment row. Callers can append rows with `markdown_table`.
63pub fn markdown_table_head<S>(out: &mut S) -> Result
64where
65 S: Write + ?Sized,
66{
67 write!(out, "| level | span | message |\n| ------: | :-----: | :------- |\n")?;
68
69 Ok(())
70}