anstream/
stream.rs
1#[cfg(not(all(windows, feature = "wincon")))]
5pub trait RawStream: std::io::Write + IsTerminal + private::Sealed {}
6
7#[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
44pub trait IsTerminal: private::Sealed {
46 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
150pub trait AsLockedWrite: private::Sealed {
152 type Write<'w>: RawStream + 'w
154 where
155 Self: 'w;
156
157 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}