anstream/
stream.rs

1//! Higher-level traits to describe writeable streams
2
3/// Required functionality for underlying [`std::io::Write`] for adaptation
4#[cfg(not(all(windows, feature = "wincon")))]
5pub trait RawStream: std::io::Write + IsTerminal + private::Sealed {}
6
7/// Required functionality for underlying [`std::io::Write`] for adaptation
8#[cfg(all(windows, feature = "wincon"))]
9pub trait RawStream:
10    std::io::Write + IsTerminal + anstyle_wincon::WinconStream + private::Sealed
11{
12}
13
14impl RawStream for std::io::Stdout {}
15
16impl RawStream for std::io::StdoutLock<'_> {}
17
18impl RawStream for &'_ mut std::io::StdoutLock<'_> {}
19
20impl RawStream for std::io::Stderr {}
21
22impl RawStream for std::io::StderrLock<'_> {}
23
24impl RawStream for &'_ mut std::io::StderrLock<'_> {}
25
26impl RawStream for Box<dyn std::io::Write> {}
27
28impl RawStream for &'_ mut Box<dyn std::io::Write> {}
29
30impl RawStream for Vec<u8> {}
31
32impl RawStream for &'_ mut Vec<u8> {}
33
34impl RawStream for std::fs::File {}
35
36impl RawStream for &'_ mut std::fs::File {}
37
38#[allow(deprecated)]
39impl RawStream for crate::Buffer {}
40
41#[allow(deprecated)]
42impl RawStream for &'_ mut crate::Buffer {}
43
44/// Trait to determine if a descriptor/handle refers to a terminal/tty.
45pub trait IsTerminal: private::Sealed {
46    /// Returns `true` if the descriptor/handle refers to a terminal/tty.
47    fn is_terminal(&self) -> bool;
48}
49
50impl IsTerminal for std::io::Stdout {
51    #[inline]
52    fn is_terminal(&self) -> bool {
53        is_terminal_polyfill::IsTerminal::is_terminal(self)
54    }
55}
56
57impl IsTerminal for std::io::StdoutLock<'_> {
58    #[inline]
59    fn is_terminal(&self) -> bool {
60        is_terminal_polyfill::IsTerminal::is_terminal(self)
61    }
62}
63
64impl IsTerminal for &'_ mut std::io::StdoutLock<'_> {
65    #[inline]
66    fn is_terminal(&self) -> bool {
67        (**self).is_terminal()
68    }
69}
70
71impl IsTerminal for std::io::Stderr {
72    #[inline]
73    fn is_terminal(&self) -> bool {
74        is_terminal_polyfill::IsTerminal::is_terminal(self)
75    }
76}
77
78impl IsTerminal for std::io::StderrLock<'_> {
79    #[inline]
80    fn is_terminal(&self) -> bool {
81        is_terminal_polyfill::IsTerminal::is_terminal(self)
82    }
83}
84
85impl IsTerminal for &'_ mut std::io::StderrLock<'_> {
86    #[inline]
87    fn is_terminal(&self) -> bool {
88        (**self).is_terminal()
89    }
90}
91
92impl IsTerminal for Box<dyn std::io::Write> {
93    #[inline]
94    fn is_terminal(&self) -> bool {
95        false
96    }
97}
98
99impl IsTerminal for &'_ mut Box<dyn std::io::Write> {
100    #[inline]
101    fn is_terminal(&self) -> bool {
102        false
103    }
104}
105
106impl IsTerminal for Vec<u8> {
107    #[inline]
108    fn is_terminal(&self) -> bool {
109        false
110    }
111}
112
113impl IsTerminal for &'_ mut Vec<u8> {
114    #[inline]
115    fn is_terminal(&self) -> bool {
116        false
117    }
118}
119
120impl IsTerminal for std::fs::File {
121    #[inline]
122    fn is_terminal(&self) -> bool {
123        is_terminal_polyfill::IsTerminal::is_terminal(self)
124    }
125}
126
127impl IsTerminal for &'_ mut std::fs::File {
128    #[inline]
129    fn is_terminal(&self) -> bool {
130        (**self).is_terminal()
131    }
132}
133
134#[allow(deprecated)]
135impl IsTerminal for crate::Buffer {
136    #[inline]
137    fn is_terminal(&self) -> bool {
138        false
139    }
140}
141
142#[allow(deprecated)]
143impl IsTerminal for &'_ mut crate::Buffer {
144    #[inline]
145    fn is_terminal(&self) -> bool {
146        (**self).is_terminal()
147    }
148}
149
150/// Lock a stream
151pub trait AsLockedWrite: private::Sealed {
152    /// Locked writer type
153    type Write<'w>: RawStream + 'w
154    where
155        Self: 'w;
156
157    /// Lock a stream
158    fn as_locked_write(&mut self) -> Self::Write<'_>;
159}
160
161impl AsLockedWrite for std::io::Stdout {
162    type Write<'w> = std::io::StdoutLock<'w>;
163
164    #[inline]
165    fn as_locked_write(&mut self) -> Self::Write<'_> {
166        self.lock()
167    }
168}
169
170impl AsLockedWrite for std::io::StdoutLock<'static> {
171    type Write<'w> = &'w mut Self;
172
173    #[inline]
174    fn as_locked_write(&mut self) -> Self::Write<'_> {
175        self
176    }
177}
178
179impl AsLockedWrite for std::io::Stderr {
180    type Write<'w> = std::io::StderrLock<'w>;
181
182    #[inline]
183    fn as_locked_write(&mut self) -> Self::Write<'_> {
184        self.lock()
185    }
186}
187
188impl AsLockedWrite for std::io::StderrLock<'static> {
189    type Write<'w> = &'w mut Self;
190
191    #[inline]
192    fn as_locked_write(&mut self) -> Self::Write<'_> {
193        self
194    }
195}
196
197impl AsLockedWrite for Box<dyn std::io::Write> {
198    type Write<'w> = &'w mut Self;
199
200    #[inline]
201    fn as_locked_write(&mut self) -> Self::Write<'_> {
202        self
203    }
204}
205
206impl AsLockedWrite for Vec<u8> {
207    type Write<'w> = &'w mut Self;
208
209    #[inline]
210    fn as_locked_write(&mut self) -> Self::Write<'_> {
211        self
212    }
213}
214
215impl AsLockedWrite for std::fs::File {
216    type Write<'w> = &'w mut Self;
217
218    #[inline]
219    fn as_locked_write(&mut self) -> Self::Write<'_> {
220        self
221    }
222}
223
224#[allow(deprecated)]
225impl AsLockedWrite for crate::Buffer {
226    type Write<'w> = &'w mut Self;
227
228    #[inline]
229    fn as_locked_write(&mut self) -> Self::Write<'_> {
230        self
231    }
232}
233
234mod private {
235    pub trait Sealed {}
236
237    impl Sealed for std::io::Stdout {}
238
239    impl Sealed for std::io::StdoutLock<'_> {}
240
241    impl Sealed for &'_ mut std::io::StdoutLock<'_> {}
242
243    impl Sealed for std::io::Stderr {}
244
245    impl Sealed for std::io::StderrLock<'_> {}
246
247    impl Sealed for &'_ mut std::io::StderrLock<'_> {}
248
249    impl Sealed for Box<dyn std::io::Write> {}
250
251    impl Sealed for &'_ mut Box<dyn std::io::Write> {}
252
253    impl Sealed for Vec<u8> {}
254
255    impl Sealed for &'_ mut Vec<u8> {}
256
257    impl Sealed for std::fs::File {}
258
259    impl Sealed for &'_ mut std::fs::File {}
260
261    #[allow(deprecated)]
262    impl Sealed for crate::Buffer {}
263
264    #[allow(deprecated)]
265    impl Sealed for &'_ mut crate::Buffer {}
266}