1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3
4pub mod element;
5mod render;
6mod style;
7
8pub use render::Renderer;
9pub use style::*;
10
11#[cfg(feature = "unicode")]
12#[inline]
13fn width(text: &str) -> usize {
14 use unicode_width::UnicodeWidthStr;
15 text.width()
16}
17
18#[cfg(not(feature = "unicode"))]
19#[inline]
20fn width(text: &str) -> usize {
21 text.len()
22}
23
24#[cfg(test)]
25mod tests {
26 use std::io;
27
28 use crate::element::IntoElement;
29
30 use super::*;
31
32 #[test]
33 fn styled() -> io::Result<()> {
34 let mut r = Renderer::new(vec![]);
35 r.reset()?
36 .render((
37 "one".into_element(),
38 "two".styled(Style::fg(4).with(Style::bg(5))),
39 "three".into_element(),
40 ))?
41 .finish()?;
42 assert_eq!(
43 r.writer,
44 b"\rone\x1b[m\x1b[38;5;4m\x1b[48;5;5mtwo\x1b[mthree\x1b[m\x1b[K\x1b[?25l",
45 );
46 Ok(())
47 }
48
49 #[test]
50 fn styledd_fixed_width() -> io::Result<()> {
51 let mut r = Renderer::new(vec![]);
52 r.reset()?
53 .render(
54 "test"
55 .fixed_width(10)
56 .styled(Style::fg(42).with(Style::bg(43))),
57 )?
58 .finish()?;
59 assert_eq!(
60 r.writer,
61 b"\r\x1b[38;5;42m\x1b[48;5;43mtest\x1b[m\x1b[38;5;42m\x1b[48;5;43m \x1b[m\x1b[K\x1b[?25l",
62 );
63 Ok(())
64 }
65}