Skip to content

Commit 8a57dcc

Browse files
authored
Merge pull request #223 from DaniPopes/raw-stream-refmut
refactor: Implement `RawStream` for `&mut T` and `Box<T>` generically
2 parents 5066a91 + a1cbc88 commit 8a57dcc

File tree

4 files changed

+29
-115
lines changed

4 files changed

+29
-115
lines changed

crates/anstream/src/buffer.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,3 @@ impl anstyle_wincon::WinconStream for Buffer {
5454
self.0.write_colored(fg, bg, data)
5555
}
5656
}
57-
58-
#[cfg(all(windows, feature = "wincon"))]
59-
impl anstyle_wincon::WinconStream for &'_ mut Buffer {
60-
fn write_colored(
61-
&mut self,
62-
fg: Option<anstyle::AnsiColor>,
63-
bg: Option<anstyle::AnsiColor>,
64-
data: &[u8],
65-
) -> std::io::Result<usize> {
66-
(**self).write_colored(fg, bg, data)
67-
}
68-
}

crates/anstream/src/stream.rs

Lines changed: 22 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -11,92 +11,82 @@ pub trait RawStream:
1111
{
1212
}
1313

14+
impl<T: RawStream + ?Sized> RawStream for &mut T {}
15+
impl<T: RawStream + ?Sized> RawStream for Box<T> {}
16+
1417
impl RawStream for std::io::Stdout {}
1518

1619
impl RawStream for std::io::StdoutLock<'_> {}
1720

18-
impl RawStream for &'_ mut std::io::StdoutLock<'_> {}
19-
2021
impl RawStream for std::io::Stderr {}
2122

2223
impl RawStream for std::io::StderrLock<'_> {}
2324

24-
impl RawStream for &'_ mut std::io::StderrLock<'_> {}
25-
26-
impl RawStream for Box<dyn std::io::Write> {}
27-
28-
impl RawStream for &'_ mut Box<dyn std::io::Write> {}
25+
impl RawStream for dyn std::io::Write {}
2926

3027
impl RawStream for Vec<u8> {}
3128

32-
impl RawStream for &'_ mut Vec<u8> {}
33-
3429
impl RawStream for std::fs::File {}
3530

36-
impl RawStream for &'_ mut std::fs::File {}
37-
3831
#[allow(deprecated)]
3932
impl RawStream for crate::Buffer {}
4033

41-
#[allow(deprecated)]
42-
impl RawStream for &'_ mut crate::Buffer {}
43-
4434
/// Trait to determine if a descriptor/handle refers to a terminal/tty.
4535
pub trait IsTerminal: private::Sealed {
4636
/// Returns `true` if the descriptor/handle refers to a terminal/tty.
4737
fn is_terminal(&self) -> bool;
4838
}
4939

50-
impl IsTerminal for std::io::Stdout {
40+
impl<T: IsTerminal + ?Sized> IsTerminal for &T {
5141
#[inline]
5242
fn is_terminal(&self) -> bool {
53-
is_terminal_polyfill::IsTerminal::is_terminal(self)
43+
(**self).is_terminal()
5444
}
5545
}
5646

57-
impl IsTerminal for std::io::StdoutLock<'_> {
47+
impl<T: IsTerminal + ?Sized> IsTerminal for &mut T {
5848
#[inline]
5949
fn is_terminal(&self) -> bool {
60-
is_terminal_polyfill::IsTerminal::is_terminal(self)
50+
(**self).is_terminal()
6151
}
6252
}
6353

64-
impl IsTerminal for &'_ mut std::io::StdoutLock<'_> {
54+
impl<T: IsTerminal + ?Sized> IsTerminal for Box<T> {
6555
#[inline]
6656
fn is_terminal(&self) -> bool {
6757
(**self).is_terminal()
6858
}
6959
}
7060

71-
impl IsTerminal for std::io::Stderr {
61+
impl IsTerminal for std::io::Stdout {
7262
#[inline]
7363
fn is_terminal(&self) -> bool {
7464
is_terminal_polyfill::IsTerminal::is_terminal(self)
7565
}
7666
}
7767

78-
impl IsTerminal for std::io::StderrLock<'_> {
68+
impl IsTerminal for std::io::StdoutLock<'_> {
7969
#[inline]
8070
fn is_terminal(&self) -> bool {
8171
is_terminal_polyfill::IsTerminal::is_terminal(self)
8272
}
8373
}
8474

85-
impl IsTerminal for &'_ mut std::io::StderrLock<'_> {
75+
impl IsTerminal for std::io::Stderr {
8676
#[inline]
8777
fn is_terminal(&self) -> bool {
88-
(**self).is_terminal()
78+
is_terminal_polyfill::IsTerminal::is_terminal(self)
8979
}
9080
}
9181

92-
impl IsTerminal for Box<dyn std::io::Write> {
82+
impl IsTerminal for std::io::StderrLock<'_> {
9383
#[inline]
9484
fn is_terminal(&self) -> bool {
95-
false
85+
is_terminal_polyfill::IsTerminal::is_terminal(self)
9686
}
9787
}
9888

99-
impl IsTerminal for &'_ mut Box<dyn std::io::Write> {
89+
impl IsTerminal for dyn std::io::Write {
10090
#[inline]
10191
fn is_terminal(&self) -> bool {
10292
false
@@ -110,27 +100,13 @@ impl IsTerminal for Vec<u8> {
110100
}
111101
}
112102

113-
impl IsTerminal for &'_ mut Vec<u8> {
114-
#[inline]
115-
fn is_terminal(&self) -> bool {
116-
false
117-
}
118-
}
119-
120103
impl IsTerminal for std::fs::File {
121104
#[inline]
122105
fn is_terminal(&self) -> bool {
123106
is_terminal_polyfill::IsTerminal::is_terminal(self)
124107
}
125108
}
126109

127-
impl IsTerminal for &'_ mut std::fs::File {
128-
#[inline]
129-
fn is_terminal(&self) -> bool {
130-
(**self).is_terminal()
131-
}
132-
}
133-
134110
#[allow(deprecated)]
135111
impl IsTerminal for crate::Buffer {
136112
#[inline]
@@ -139,14 +115,6 @@ impl IsTerminal for crate::Buffer {
139115
}
140116
}
141117

142-
#[allow(deprecated)]
143-
impl IsTerminal for &'_ mut crate::Buffer {
144-
#[inline]
145-
fn is_terminal(&self) -> bool {
146-
(**self).is_terminal()
147-
}
148-
}
149-
150118
/// Lock a stream
151119
pub trait AsLockedWrite: private::Sealed {
152120
/// Locked writer type
@@ -194,7 +162,7 @@ impl AsLockedWrite for std::io::StderrLock<'static> {
194162
}
195163
}
196164

197-
impl AsLockedWrite for Box<dyn std::io::Write> {
165+
impl AsLockedWrite for dyn std::io::Write {
198166
type Write<'w> = &'w mut Self;
199167

200168
#[inline]
@@ -234,33 +202,24 @@ impl AsLockedWrite for crate::Buffer {
234202
mod private {
235203
pub trait Sealed {}
236204

205+
impl<T: Sealed + ?Sized> Sealed for &T {}
206+
impl<T: Sealed + ?Sized> Sealed for &mut T {}
207+
impl<T: Sealed + ?Sized> Sealed for Box<T> {}
208+
237209
impl Sealed for std::io::Stdout {}
238210

239211
impl Sealed for std::io::StdoutLock<'_> {}
240212

241-
impl Sealed for &'_ mut std::io::StdoutLock<'_> {}
242-
243213
impl Sealed for std::io::Stderr {}
244214

245215
impl Sealed for std::io::StderrLock<'_> {}
246216

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> {}
217+
impl Sealed for dyn std::io::Write {}
252218

253219
impl Sealed for Vec<u8> {}
254220

255-
impl Sealed for &'_ mut Vec<u8> {}
256-
257221
impl Sealed for std::fs::File {}
258222

259-
impl Sealed for &'_ mut std::fs::File {}
260-
261223
#[allow(deprecated)]
262224
impl Sealed for crate::Buffer {}
263-
264-
#[allow(deprecated)]
265-
impl Sealed for &'_ mut crate::Buffer {}
266225
}

crates/anstyle-wincon/src/ansi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Low-level ANSI-styling
22
33
/// Write ANSI colored text to the stream
4-
pub fn write_colored<S: std::io::Write>(
4+
pub fn write_colored<S: std::io::Write + ?Sized>(
55
stream: &mut S,
66
fg: Option<anstyle::AnsiColor>,
77
bg: Option<anstyle::AnsiColor>,

crates/anstyle-wincon/src/stream.rs

Lines changed: 6 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@ pub trait WinconStream {
99
) -> std::io::Result<usize>;
1010
}
1111

12-
impl WinconStream for Box<dyn std::io::Write> {
12+
impl<T: WinconStream + ?Sized> WinconStream for &mut T {
1313
fn write_colored(
1414
&mut self,
1515
fg: Option<anstyle::AnsiColor>,
1616
bg: Option<anstyle::AnsiColor>,
1717
data: &[u8],
1818
) -> std::io::Result<usize> {
19-
crate::ansi::write_colored(self, fg, bg, data)
19+
(**self).write_colored(fg, bg, data)
2020
}
2121
}
2222

23-
impl WinconStream for &'_ mut Box<dyn std::io::Write> {
23+
impl<T: WinconStream + ?Sized> WinconStream for Box<T> {
2424
fn write_colored(
2525
&mut self,
2626
fg: Option<anstyle::AnsiColor>,
@@ -31,7 +31,7 @@ impl WinconStream for &'_ mut Box<dyn std::io::Write> {
3131
}
3232
}
3333

34-
impl WinconStream for std::fs::File {
34+
impl WinconStream for dyn std::io::Write {
3535
fn write_colored(
3636
&mut self,
3737
fg: Option<anstyle::AnsiColor>,
@@ -42,14 +42,14 @@ impl WinconStream for std::fs::File {
4242
}
4343
}
4444

45-
impl WinconStream for &'_ mut std::fs::File {
45+
impl WinconStream for std::fs::File {
4646
fn write_colored(
4747
&mut self,
4848
fg: Option<anstyle::AnsiColor>,
4949
bg: Option<anstyle::AnsiColor>,
5050
data: &[u8],
5151
) -> std::io::Result<usize> {
52-
(**self).write_colored(fg, bg, data)
52+
crate::ansi::write_colored(self, fg, bg, data)
5353
}
5454
}
5555

@@ -64,17 +64,6 @@ impl WinconStream for Vec<u8> {
6464
}
6565
}
6666

67-
impl WinconStream for &'_ mut Vec<u8> {
68-
fn write_colored(
69-
&mut self,
70-
fg: Option<anstyle::AnsiColor>,
71-
bg: Option<anstyle::AnsiColor>,
72-
data: &[u8],
73-
) -> std::io::Result<usize> {
74-
(**self).write_colored(fg, bg, data)
75-
}
76-
}
77-
7867
impl WinconStream for std::io::Stdout {
7968
fn write_colored(
8069
&mut self,
@@ -150,25 +139,3 @@ mod platform {
150139
}
151140
}
152141
}
153-
154-
impl WinconStream for &'_ mut std::io::StdoutLock<'_> {
155-
fn write_colored(
156-
&mut self,
157-
fg: Option<anstyle::AnsiColor>,
158-
bg: Option<anstyle::AnsiColor>,
159-
data: &[u8],
160-
) -> std::io::Result<usize> {
161-
(**self).write_colored(fg, bg, data)
162-
}
163-
}
164-
165-
impl WinconStream for &'_ mut std::io::StderrLock<'_> {
166-
fn write_colored(
167-
&mut self,
168-
fg: Option<anstyle::AnsiColor>,
169-
bg: Option<anstyle::AnsiColor>,
170-
data: &[u8],
171-
) -> std::io::Result<usize> {
172-
(**self).write_colored(fg, bg, data)
173-
}
174-
}

0 commit comments

Comments
 (0)