Skip to main content

cli_ui/prompt/
stream.rs

1#![allow(missing_docs)]
2//! Streaming log output — ports `@clack/prompts` `stream.{info,warn,error,success,step,message}`.
3//!
4//! Writes a header line, then forwards every line of `iter` through the
5//! framed `│  ` prefix.
6
7use crate::styles::{paint, DIM, WHITE};
8
9const BAR: &str = "│";
10const S_INFO: &str = "●";
11const S_SUCCESS: &str = "◆";
12const S_STEP: &str = "◇";
13const S_WARN: &str = "▲";
14const S_ERROR: &str = "■";
15
16pub fn message<I>(iter: I, symbol: &str)
17where
18    I: IntoIterator,
19    I::Item: AsRef<str>,
20{
21    eprintln!("{}", paint(DIM, BAR));
22    let mut started = false;
23    for chunk in iter {
24        let chunk = chunk.as_ref();
25        for (i, line) in chunk.split('\n').enumerate() {
26            if i > 0 || started {
27                eprintln!();
28                eprint!("{}  ", paint(DIM, BAR));
29            } else {
30                eprint!("{}  ", symbol);
31            }
32            eprint!("{}", paint(WHITE, line));
33            started = true;
34        }
35    }
36    eprintln!();
37}
38
39pub fn info<I>(iter: I)
40where
41    I: IntoIterator,
42    I::Item: AsRef<str>,
43{
44    message(iter, &paint(super::settings::colors().accent, S_INFO));
45}
46pub fn success<I>(iter: I)
47where
48    I: IntoIterator,
49    I::Item: AsRef<str>,
50{
51    message(iter, &paint(super::settings::colors().success, S_SUCCESS));
52}
53pub fn step<I>(iter: I)
54where
55    I: IntoIterator,
56    I::Item: AsRef<str>,
57{
58    message(iter, &paint(super::settings::colors().success, S_STEP));
59}
60pub fn warn<I>(iter: I)
61where
62    I: IntoIterator,
63    I::Item: AsRef<str>,
64{
65    message(iter, &paint(super::settings::colors().error, S_WARN));
66}
67pub fn warning<I>(iter: I)
68where
69    I: IntoIterator,
70    I::Item: AsRef<str>,
71{
72    warn(iter);
73}
74pub fn error<I>(iter: I)
75where
76    I: IntoIterator,
77    I::Item: AsRef<str>,
78{
79    message(iter, &paint(super::settings::colors().cancel, S_ERROR));
80}