is_interactive/
lib.rs

1use atty::Stream;
2
3extern crate atty;
4
5pub fn is_interactive() -> bool {
6    _is_interactive(Stream::Stdout) || _is_interactive(Stream::Stderr)
7}
8
9fn _is_interactive(stream: Stream) -> bool {
10    let is_ci = std::env::var_os("CI").is_some();
11    let is_dumb_term = match std::env::var("TERM") {
12        Ok(string) => {
13            string == "dumb"
14        },
15        Err(_error) => {
16            // "env.TERM" doesn't exist
17            // we can treat this as interactive
18            false 
19        }
20    };
21
22    atty::is(stream) && !is_ci && !is_dumb_term
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_is_interactive() {
31        assert_eq!(is_interactive(), true);
32    }
33
34    #[test]
35    fn test_is_interactive_ci() {
36        std::env::set_var("CI", "true");
37        assert_eq!(is_interactive(), false);
38    }
39
40    #[test]
41    fn test_is_interactive_dumb_term() {
42        std::env::set_var("TERM", "dumb");
43        assert_eq!(is_interactive(), false);
44    }
45
46    #[test]
47    fn test_is_interactive_ci_dumb_term() {
48        std::env::set_var("CI", "true");
49        std::env::set_var("TERM", "dumb");
50        assert_eq!(is_interactive(), false);
51    }
52
53    #[test]
54    fn test_is_interactive_ci_dumb_term_stdout() {
55        std::env::set_var("CI", "true");
56        std::env::set_var("TERM", "dumb");
57        assert_eq!(_is_interactive(Stream::Stdout), false);
58    }
59
60    #[test]
61    fn test_is_interactive_ci_dumb_term_stderr() {
62        std::env::set_var("CI", "true");
63        std::env::set_var("TERM", "dumb");
64        assert_eq!(_is_interactive(Stream::Stderr), false);
65    }
66
67    #[test]
68    fn test_is_interactive_ci_stdout() {
69        std::env::set_var("CI", "true");
70        assert_eq!(_is_interactive(Stream::Stdout), false);
71    }
72
73    #[test]
74    fn test_is_interactive_ci_stderr() {
75        std::env::set_var("CI", "true");
76        assert_eq!(_is_interactive(Stream::Stderr), false);
77    }
78
79    #[test]
80    fn test_is_interactive_dumb_term_stdout() {
81        std::env::set_var("TERM", "dumb");
82        assert_eq!(_is_interactive(Stream::Stdout), false);
83    }
84
85    #[test]
86    fn test_is_interactive_dumb_term_stderr() {
87        std::env::set_var("TERM", "dumb");
88        assert_eq!(_is_interactive(Stream::Stderr), false);
89    }
90    
91}