line_ui/
lib.rs

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}