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 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}