1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use crate::{Terminal, TerminalColorSupport, WriteTerminal};
#[cfg(unix)]
use std::os::unix::io::{AsRawFd, RawFd};
#[cfg(target_os = "wasi")]
use std::os::wasi::io::{AsRawFd, RawFd};
use std::{
fmt,
io::{self, IoSlice, Write},
};
#[cfg(windows)]
use unsafe_io::{AsRawHandleOrSocket, RawHandleOrSocket};
#[derive(Debug)]
pub struct NeverTerminalWriter<Inner: Write> {
inner: Inner,
}
impl<Inner: Write> NeverTerminalWriter<Inner> {
pub fn new(inner: Inner) -> Self {
Self { inner }
}
#[inline]
pub fn into_inner(self) -> Inner {
self.inner
}
}
#[cfg(not(windows))]
impl<Inner: Write + AsRawFd> AsRawFd for NeverTerminalWriter<Inner> {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.inner.as_raw_fd()
}
}
#[cfg(windows)]
impl<Inner: Write + AsRawHandleOrSocket> AsRawHandleOrSocket for NeverTerminalWriter<Inner> {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
self.inner.as_raw_handle_or_socket()
}
}
impl<Inner: Write> Terminal for NeverTerminalWriter<Inner> {}
impl<Inner: Write> WriteTerminal for NeverTerminalWriter<Inner> {
fn color_support(&self) -> TerminalColorSupport {
TerminalColorSupport::default()
}
fn color_preference(&self) -> bool {
false
}
fn is_output_terminal(&self) -> bool {
false
}
}
impl<Inner: Write> Write for NeverTerminalWriter<Inner> {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.inner.write(buf)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
#[inline]
fn write_vectored(&mut self, bufs: &[IoSlice]) -> io::Result<usize> {
self.inner.write_vectored(bufs)
}
#[cfg(can_vector)]
#[inline]
fn is_write_vectored(&self) -> bool {
self.inner.is_write_vectored()
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
self.inner.write_all(buf)
}
#[cfg(write_all_vectored)]
#[inline]
fn write_all_vectored(&mut self, bufs: &mut [IoSlice]) -> io::Result<()> {
self.inner.write_all_vectored(bufs)
}
#[inline]
fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> {
self.inner.write_fmt(fmt)
}
}