1use tau_cli_term_raw::{Color, Span, Style, StyledBlock, StyledText};
6use tau_themes::{ResolvedSpan, StyleName, Theme, ThemeStyle, ThemedText};
7
8pub fn resolve(theme: &Theme, name: &str) -> Style {
10 convert_style(theme.resolve_style(&StyleName::new(name)))
11}
12
13pub fn convert_style(ts: ThemeStyle) -> Style {
15 Style {
16 fg: ts.fg.map(convert_color),
17 bg: ts.bg.map(convert_color),
18 bold: ts.bold,
19 underline: ts.underline,
20 italic: ts.italic,
21 strikethrough: ts.strikethrough,
22 }
23}
24
25pub fn themed_text(theme: &Theme, text: &ThemedText) -> StyledText {
27 StyledText::from(
28 theme
29 .resolve(text)
30 .into_iter()
31 .map(resolved_span)
32 .collect::<Vec<_>>(),
33 )
34}
35
36fn resolved_span(span: ResolvedSpan<'_>) -> Span {
37 Span::new(span.text.to_owned(), convert_style(span.style))
38}
39
40pub fn themed_block(theme: &Theme, name: &str, text: impl Into<String>) -> StyledBlock {
45 let mut themed = ThemedText::new();
46 let style = themed.add_style(name);
47 themed.push(style, text);
48
49 let ts = theme.resolve_style(&StyleName::new(name));
50 let mut block = StyledBlock::new(themed_text(theme, &themed));
51 if let Some(bg) = ts.bg {
52 block = block.bg(convert_color(bg));
53 }
54 block
55}
56
57pub fn convert_color(c: tau_themes::Color) -> Color {
60 use tau_themes::Color as TC;
61 match c {
62 TC::Black => Color::Black,
63 TC::DarkRed => Color::DarkRed,
64 TC::DarkGreen => Color::DarkGreen,
65 TC::DarkYellow => Color::DarkYellow,
66 TC::DarkBlue => Color::DarkBlue,
67 TC::DarkMagenta => Color::DarkMagenta,
68 TC::DarkCyan => Color::DarkCyan,
69 TC::DarkGrey => Color::DarkGrey,
70 TC::Red => Color::Red,
71 TC::Green => Color::Green,
72 TC::Yellow => Color::Yellow,
73 TC::Blue => Color::Blue,
74 TC::Magenta => Color::Magenta,
75 TC::Cyan => Color::Cyan,
76 TC::White => Color::White,
77 TC::Grey => Color::Grey,
78 TC::Rgb { r, g, b } => Color::Rgb { r, g, b },
79 }
80}
81
82#[cfg(test)]
83mod tests;