io_extras/os/windows/
traits.rs

1//! `AsHandleOrSocket` and related `From` impls.
2
3use super::types::{BorrowedHandleOrSocket, OwnedHandleOrSocket};
4use super::AsRawHandleOrSocket;
5use io_lifetimes::{AsHandle, AsSocket};
6use std::fs::File;
7use std::io::{Stderr, StderrLock, Stdin, StdinLock, Stdout, StdoutLock};
8use std::net::{TcpListener, TcpStream, UdpSocket};
9use std::process::{ChildStderr, ChildStdin, ChildStdout};
10
11/// Like [`AsHandle`] and [`AsSocket`], but implementable by types which
12/// can implement either one.
13pub trait AsHandleOrSocket {
14    /// Like [`AsHandle::as_handle`] and [`AsSocket::as_socket`]
15    /// but can return either type.
16    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_>;
17}
18
19impl AsHandleOrSocket for OwnedHandleOrSocket {
20    #[inline]
21    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
22        unsafe { BorrowedHandleOrSocket::borrow_raw(self.as_raw_handle_or_socket()) }
23    }
24}
25
26impl AsHandleOrSocket for BorrowedHandleOrSocket<'_> {
27    #[inline]
28    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
29        *self
30    }
31}
32
33impl AsHandleOrSocket for Stdin {
34    #[inline]
35    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
36        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
37    }
38}
39
40impl AsHandleOrSocket for StdinLock<'_> {
41    #[inline]
42    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
43        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
44    }
45}
46
47impl AsHandleOrSocket for Stdout {
48    #[inline]
49    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
50        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
51    }
52}
53
54impl AsHandleOrSocket for StdoutLock<'_> {
55    #[inline]
56    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
57        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
58    }
59}
60
61impl AsHandleOrSocket for Stderr {
62    #[inline]
63    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
64        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
65    }
66}
67
68impl AsHandleOrSocket for StderrLock<'_> {
69    #[inline]
70    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
71        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
72    }
73}
74
75impl AsHandleOrSocket for File {
76    #[inline]
77    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
78        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
79    }
80}
81
82impl AsHandleOrSocket for ChildStdin {
83    #[inline]
84    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
85        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
86    }
87}
88
89impl AsHandleOrSocket for ChildStdout {
90    #[inline]
91    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
92        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
93    }
94}
95
96impl AsHandleOrSocket for ChildStderr {
97    #[inline]
98    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
99        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
100    }
101}
102
103impl AsHandleOrSocket for TcpStream {
104    #[inline]
105    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
106        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
107    }
108}
109
110impl AsHandleOrSocket for TcpListener {
111    #[inline]
112    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
113        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
114    }
115}
116
117impl AsHandleOrSocket for UdpSocket {
118    #[inline]
119    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
120        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
121    }
122}
123
124#[cfg(feature = "async-std")]
125impl AsHandleOrSocket for async_std::io::Stdin {
126    #[inline]
127    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
128        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
129    }
130}
131
132#[cfg(feature = "async-std")]
133impl AsHandleOrSocket for async_std::io::Stdout {
134    #[inline]
135    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
136        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
137    }
138}
139
140#[cfg(feature = "async-std")]
141impl AsHandleOrSocket for async_std::io::Stderr {
142    #[inline]
143    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
144        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
145    }
146}
147
148#[cfg(feature = "async-std")]
149impl AsHandleOrSocket for async_std::fs::File {
150    #[inline]
151    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
152        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
153    }
154}
155
156// async_std's `ChildStdin`, `ChildStdout`, and `ChildStderr` don't implement
157// `AsFd` or `AsHandle`.
158
159#[cfg(feature = "async-std")]
160impl AsHandleOrSocket for async_std::net::TcpStream {
161    #[inline]
162    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
163        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
164    }
165}
166
167#[cfg(feature = "async-std")]
168impl AsHandleOrSocket for async_std::net::TcpListener {
169    #[inline]
170    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
171        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
172    }
173}
174
175#[cfg(feature = "async-std")]
176impl AsHandleOrSocket for async_std::net::UdpSocket {
177    #[inline]
178    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
179        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
180    }
181}
182
183#[cfg(feature = "tokio")]
184impl AsHandleOrSocket for tokio::io::Stdin {
185    #[inline]
186    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
187        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
188    }
189}
190
191#[cfg(feature = "tokio")]
192impl AsHandleOrSocket for tokio::io::Stdout {
193    #[inline]
194    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
195        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
196    }
197}
198
199#[cfg(feature = "tokio")]
200impl AsHandleOrSocket for tokio::io::Stderr {
201    #[inline]
202    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
203        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
204    }
205}
206
207#[cfg(feature = "tokio")]
208impl AsHandleOrSocket for tokio::fs::File {
209    #[inline]
210    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
211        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
212    }
213}
214
215#[cfg(feature = "tokio")]
216impl AsHandleOrSocket for tokio::net::TcpStream {
217    #[inline]
218    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
219        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
220    }
221}
222
223#[cfg(feature = "tokio")]
224impl AsHandleOrSocket for tokio::net::TcpListener {
225    #[inline]
226    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
227        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
228    }
229}
230
231#[cfg(feature = "tokio")]
232impl AsHandleOrSocket for tokio::net::UdpSocket {
233    #[inline]
234    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
235        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
236    }
237}
238
239#[cfg(feature = "tokio")]
240impl AsHandleOrSocket for tokio::process::ChildStdin {
241    #[inline]
242    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
243        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
244    }
245}
246
247#[cfg(feature = "tokio")]
248impl AsHandleOrSocket for tokio::process::ChildStdout {
249    #[inline]
250    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
251        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
252    }
253}
254
255#[cfg(feature = "tokio")]
256impl AsHandleOrSocket for tokio::process::ChildStderr {
257    #[inline]
258    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
259        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
260    }
261}
262
263#[cfg(feature = "os_pipe")]
264impl AsHandleOrSocket for os_pipe::PipeReader {
265    #[inline]
266    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
267        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
268    }
269}
270
271#[cfg(feature = "os_pipe")]
272impl AsHandleOrSocket for os_pipe::PipeWriter {
273    #[inline]
274    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
275        BorrowedHandleOrSocket::from_handle(Self::as_handle(self))
276    }
277}
278
279#[cfg(feature = "socket2")]
280impl AsHandleOrSocket for socket2::Socket {
281    #[inline]
282    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
283        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
284    }
285}
286
287#[cfg(feature = "use_mio_net")]
288#[cfg(not(io_lifetimes_use_std))] // TODO: Enable when we have impls for mio
289impl AsHandleOrSocket for mio::net::TcpStream {
290    #[inline]
291    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
292        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
293    }
294}
295
296#[cfg(feature = "use_mio_net")]
297#[cfg(not(io_lifetimes_use_std))] // TODO: Enable when we have impls for mio
298impl AsHandleOrSocket for mio::net::TcpListener {
299    #[inline]
300    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
301        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
302    }
303}
304
305#[cfg(feature = "use_mio_net")]
306#[cfg(not(io_lifetimes_use_std))] // TODO: Enable when we have impls for mio
307impl AsHandleOrSocket for mio::net::UdpSocket {
308    #[inline]
309    fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
310        BorrowedHandleOrSocket::from_socket(Self::as_socket(self))
311    }
312}
313
314impl From<File> for OwnedHandleOrSocket {
315    #[inline]
316    fn from(file: File) -> OwnedHandleOrSocket {
317        OwnedHandleOrSocket::from_handle(file.into())
318    }
319}
320
321impl From<ChildStdin> for OwnedHandleOrSocket {
322    #[inline]
323    fn from(stdin: ChildStdin) -> OwnedHandleOrSocket {
324        OwnedHandleOrSocket::from_handle(stdin.into())
325    }
326}
327
328impl From<ChildStdout> for OwnedHandleOrSocket {
329    #[inline]
330    fn from(stdout: ChildStdout) -> OwnedHandleOrSocket {
331        OwnedHandleOrSocket::from_handle(stdout.into())
332    }
333}
334
335impl From<ChildStderr> for OwnedHandleOrSocket {
336    #[inline]
337    fn from(stderr: ChildStderr) -> OwnedHandleOrSocket {
338        OwnedHandleOrSocket::from_handle(stderr.into())
339    }
340}
341
342impl From<TcpStream> for OwnedHandleOrSocket {
343    #[inline]
344    fn from(stream: TcpStream) -> OwnedHandleOrSocket {
345        OwnedHandleOrSocket::from_socket(stream.into())
346    }
347}
348
349impl From<TcpListener> for OwnedHandleOrSocket {
350    #[inline]
351    fn from(listener: TcpListener) -> OwnedHandleOrSocket {
352        OwnedHandleOrSocket::from_socket(listener.into())
353    }
354}
355
356impl From<UdpSocket> for OwnedHandleOrSocket {
357    #[inline]
358    fn from(socket: UdpSocket) -> OwnedHandleOrSocket {
359        OwnedHandleOrSocket::from_socket(socket.into())
360    }
361}
362
363#[cfg(feature = "os_pipe")]
364impl From<os_pipe::PipeReader> for OwnedHandleOrSocket {
365    #[inline]
366    fn from(reader: os_pipe::PipeReader) -> OwnedHandleOrSocket {
367        OwnedHandleOrSocket::from_handle(reader.into())
368    }
369}
370
371#[cfg(feature = "os_pipe")]
372impl From<os_pipe::PipeWriter> for OwnedHandleOrSocket {
373    #[inline]
374    fn from(writer: os_pipe::PipeWriter) -> OwnedHandleOrSocket {
375        OwnedHandleOrSocket::from_handle(writer.into())
376    }
377}
378
379#[cfg(feature = "socket2")]
380impl From<socket2::Socket> for OwnedHandleOrSocket {
381    #[inline]
382    fn from(socket: socket2::Socket) -> OwnedHandleOrSocket {
383        OwnedHandleOrSocket::from_socket(socket.into())
384    }
385}
386
387#[cfg(feature = "use_mio_net")]
388#[cfg(not(io_lifetimes_use_std))] // TODO: Enable when we have impls for mio
389impl From<mio::net::TcpStream> for OwnedHandleOrSocket {
390    #[inline]
391    fn from(stream: mio::net::TcpStream) -> OwnedHandleOrSocket {
392        OwnedHandleOrSocket::from_socket(stream.into())
393    }
394}
395
396#[cfg(feature = "use_mio_net")]
397#[cfg(not(io_lifetimes_use_std))] // TODO: Enable when we have impls for mio
398impl From<mio::net::TcpListener> for OwnedHandleOrSocket {
399    #[inline]
400    fn from(listener: mio::net::TcpListener) -> OwnedHandleOrSocket {
401        OwnedHandleOrSocket::from_socket(listener.into())
402    }
403}
404
405#[cfg(feature = "use_mio_net")]
406#[cfg(not(io_lifetimes_use_std))] // TODO: Enable when we have impls for mio
407impl From<mio::net::UdpSocket> for OwnedHandleOrSocket {
408    #[inline]
409    fn from(socket: mio::net::UdpSocket) -> OwnedHandleOrSocket {
410        OwnedHandleOrSocket::from_socket(socket.into())
411    }
412}
413
414#[cfg(feature = "async-std")]
415impl From<async_std::fs::File> for OwnedHandleOrSocket {
416    #[inline]
417    fn from(file: async_std::fs::File) -> OwnedHandleOrSocket {
418        OwnedHandleOrSocket::from_handle(file.into())
419    }
420}
421
422#[cfg(feature = "async-std")]
423impl From<async_std::net::TcpStream> for OwnedHandleOrSocket {
424    #[inline]
425    fn from(stream: async_std::net::TcpStream) -> OwnedHandleOrSocket {
426        OwnedHandleOrSocket::from_socket(stream.into())
427    }
428}
429
430#[cfg(feature = "async-std")]
431impl From<async_std::net::TcpListener> for OwnedHandleOrSocket {
432    #[inline]
433    fn from(listener: async_std::net::TcpListener) -> OwnedHandleOrSocket {
434        OwnedHandleOrSocket::from_socket(listener.into())
435    }
436}
437
438#[cfg(feature = "async-std")]
439impl From<async_std::net::UdpSocket> for OwnedHandleOrSocket {
440    #[inline]
441    fn from(socket: async_std::net::UdpSocket) -> OwnedHandleOrSocket {
442        OwnedHandleOrSocket::from_socket(socket.into())
443    }
444}