Skip to main content

zui_core/
style.rs

1//! Text Styling in the terminal
2//!
3//! # Example
4//!
5//! ```rust
6//! use zui::style::{self, Style};
7//!
8//! fn main() {
9//!      println!("{}Printed in Bold{}", style::set(Style::Bold), style::set(Style::Reset));
10//!      println!("{}Printed in Italic{}", style::set(Style::Italic), style::set(Style::Reset));
11//!      println!("{}Printed in Underline{}", style::set(Style::Underline), style::set(Style::Reset));
12//!      println!("{}Printed in Strikethrough{}", style::set(Style::Strike), style::set(Style::Reset));
13//! }
14//! ```
15//!
16// Author: Abhinav Chavali
17// Date: October 7th, 2021
18// Updated: October 7th, 2021
19
20// Imports
21use crate::Ansi;
22
23/// Define style options
24#[derive(Copy, Clone)]
25pub enum Style {
26    Dim,
27    Reverse,
28    Invisible,
29    Bold,
30    Italic,
31    Underline,
32    Blinking,
33    Strike,
34    Reset,
35    NoDim,
36    NoReverse,
37    NoInvisible,
38    NoBold,
39    NoItalic,
40    NoUnderline,
41    NoBlinking,
42    NoStrike,
43}
44
45use Style::*;
46
47fn derive_style(style: Style) -> &'static str {
48    match style {
49        Dim => "\u{001b}[2m",
50        Reverse => "\u{001b}[7m",
51        Invisible => "\u{001b}[8m",
52        Bold => "\u{001b}[1m",
53        Italic => "\u{001b}[3m",
54        Underline => "\u{001b}[4m",
55        Blinking => "\u{001b}[5m",
56        Strike => "\u{001b}[9m",
57        Reset => "\u{001b}[0m",
58        NoDim => "\u{001b}[22m",
59        NoReverse => "\u{001b}[27m",
60        NoInvisible => "\u{001b}[28m",
61        NoBold => "\u{001b}[22m",
62        NoItalic => "\u{001b}[23m",
63        NoUnderline => "\u{001b}[24m",
64        NoBlinking => "\u{001b}[25m",
65        NoStrike => "\u{001b}[29m",
66    }
67}
68
69/// Set terminal style
70pub fn set(style: Style) -> Ansi {
71    Ansi::from_str(derive_style(style).to_string())
72}
73
74#[cfg(test)]
75mod tests {
76    use crate::style::set;
77    use crate::style::Style::{Bold, Italic, Reset, Strike};
78
79    #[test]
80    fn test_styling() {
81        let bold = Bold;
82        let italic = Italic;
83        let strike = Strike;
84
85        println!(
86            "{}I am writing in Bold!{} Now regular!",
87            set(bold),
88            set(Reset)
89        );
90
91        println!(
92            "{}I am writing in Italic!{} Now regular!",
93            set(italic),
94            set(Reset)
95        );
96
97        println!(
98            "{}I am writing in Strike!{} Now regular!",
99            set(strike),
100            set(Reset)
101        );
102        assert_eq!(1, 1);
103    }
104}