anstyle_ansi_term/
lib.rs

1//!  Convert between [`ansi_term`](https://lib.rs/ansi_term) and generic styling types
2
3#![cfg_attr(docsrs, feature(doc_auto_cfg))]
4#![warn(missing_docs)]
5#![warn(clippy::print_stderr)]
6#![warn(clippy::print_stdout)]
7
8/// Adapt generic styling to [`ansi_term`]
9pub fn to_ansi_term(astyle: anstyle::Style) -> ansi_term::Style {
10    let mut style = ansi_term::Style::new();
11
12    if let Some((fg, fg_bold)) = astyle.get_fg_color().map(to_ansi_color) {
13        style = style.fg(fg);
14        if fg_bold {
15            style = style.bold();
16        }
17    }
18    if let Some((bg, _)) = astyle.get_bg_color().map(to_ansi_color) {
19        style = style.on(bg);
20    }
21
22    let effects = astyle.get_effects();
23    if effects.contains(anstyle::Effects::BOLD) {
24        style = style.bold();
25    }
26    if effects.contains(anstyle::Effects::DIMMED) {
27        style = style.dimmed();
28    }
29    if effects.contains(anstyle::Effects::ITALIC) {
30        style = style.italic();
31    }
32    if effects.contains(anstyle::Effects::UNDERLINE) {
33        style = style.underline();
34    }
35    if effects.contains(anstyle::Effects::BLINK) {
36        style = style.blink();
37    }
38    if effects.contains(anstyle::Effects::INVERT) {
39        style = style.reverse();
40    }
41    if effects.contains(anstyle::Effects::HIDDEN) {
42        style = style.hidden();
43    }
44    if effects.contains(anstyle::Effects::STRIKETHROUGH) {
45        style = style.strikethrough();
46    }
47    style
48}
49
50fn to_ansi_color(color: anstyle::Color) -> (ansi_term::Color, bool) {
51    match color {
52        anstyle::Color::Ansi(ansi) => ansi_to_ansi_color(ansi),
53        anstyle::Color::Ansi256(xterm) => (xterm_to_ansi_color(xterm), false),
54        anstyle::Color::Rgb(rgb) => (rgb_to_ansi_color(rgb), false),
55    }
56}
57
58fn ansi_to_ansi_color(color: anstyle::AnsiColor) -> (ansi_term::Color, bool) {
59    match color {
60        anstyle::AnsiColor::Black => (ansi_term::Color::Black, false),
61        anstyle::AnsiColor::Red => (ansi_term::Color::Red, false),
62        anstyle::AnsiColor::Green => (ansi_term::Color::Green, false),
63        anstyle::AnsiColor::Yellow => (ansi_term::Color::Yellow, false),
64        anstyle::AnsiColor::Blue => (ansi_term::Color::Blue, false),
65        anstyle::AnsiColor::Magenta => (ansi_term::Color::Purple, false),
66        anstyle::AnsiColor::Cyan => (ansi_term::Color::Cyan, false),
67        anstyle::AnsiColor::White => (ansi_term::Color::White, false),
68        anstyle::AnsiColor::BrightBlack => (ansi_term::Color::Black, true),
69        anstyle::AnsiColor::BrightRed => (ansi_term::Color::Red, true),
70        anstyle::AnsiColor::BrightGreen => (ansi_term::Color::Green, true),
71        anstyle::AnsiColor::BrightYellow => (ansi_term::Color::Yellow, true),
72        anstyle::AnsiColor::BrightBlue => (ansi_term::Color::Black, true),
73        anstyle::AnsiColor::BrightMagenta => (ansi_term::Color::Purple, true),
74        anstyle::AnsiColor::BrightCyan => (ansi_term::Color::Cyan, true),
75        anstyle::AnsiColor::BrightWhite => (ansi_term::Color::White, true),
76    }
77}
78
79fn xterm_to_ansi_color(color: anstyle::Ansi256Color) -> ansi_term::Color {
80    ansi_term::Color::Fixed(color.0)
81}
82
83fn rgb_to_ansi_color(color: anstyle::RgbColor) -> ansi_term::Color {
84    ansi_term::Color::RGB(color.0, color.1, color.2)
85}
86
87#[doc = include_str!("../README.md")]
88#[cfg(doctest)]
89pub struct ReadmeDoctests;