1use interprocess::unnamed_pipe::{UnnamedPipeReader, UnnamedPipeWriter};
2
3pub(super) trait RawPipe: Sized {
4 type Raw: std::fmt::Debug;
5 fn raw(self) -> Self::Raw;
6 fn as_raw(&self) -> Self::Raw;
7 fn close(self);
8 unsafe fn from_raw(raw: Self::Raw) -> Self;
9}
10#[cfg(windows)]
11impl RawPipe for UnnamedPipeReader {
12 type Raw = std::os::windows::io::RawHandle;
13
14 fn raw(self) -> Self::Raw {
15 use std::os::windows::prelude::IntoRawHandle;
16 self.into_raw_handle()
17 }
18
19 fn as_raw(&self) -> Self::Raw {
20 use std::os::windows::prelude::AsRawHandle;
21 self.as_raw_handle()
22 }
23
24 fn close(self) {
25 use std::os::windows::prelude::IntoRawHandle;
26 unsafe { windows::Win32::Foundation::CloseHandle(Some(windows::Win32::Foundation::HANDLE(self.into_raw_handle() as _))) };
27 }
28
29 unsafe fn from_raw(raw: Self::Raw) -> Self {
30 use std::os::windows::prelude::FromRawHandle;
31 unsafe { Self::from_raw_handle(raw) }
32 }
33}
34#[cfg(windows)]
35impl RawPipe for UnnamedPipeWriter {
36 type Raw = std::os::windows::io::RawHandle;
37
38 fn raw(self) -> Self::Raw {
39 use std::os::windows::prelude::IntoRawHandle;
40 self.into_raw_handle()
41 }
42
43 fn as_raw(&self) -> Self::Raw {
44 use std::os::windows::prelude::AsRawHandle;
45 self.as_raw_handle()
46 }
47
48 fn close(self) {
49 use std::os::windows::prelude::IntoRawHandle;
50 unsafe { windows::Win32::Foundation::CloseHandle(Some(windows::Win32::Foundation::HANDLE(self.into_raw_handle() as _))) };
51 }
52
53 unsafe fn from_raw(raw: Self::Raw) -> Self {
54 use std::os::windows::prelude::FromRawHandle;
55 unsafe { Self::from_raw_handle(raw) }
56 }
57}
58#[cfg(unix)]
59impl RawPipe for UnnamedPipeReader {
60 type Raw = std::os::unix::io::RawFd;
61
62 fn raw(self) -> Self::Raw {
63 use std::os::unix::prelude::IntoRawFd;
64 self.into_raw_fd()
65 }
66
67 fn as_raw(&self) -> Self::Raw {
68 use std::os::unix::prelude::AsRawFd;
69 self.as_raw_fd()
70 }
71
72 fn close(self) {
73 use std::os::unix::prelude::IntoRawFd;
74 unsafe { libc::close(self.into_raw_fd()) };
75 }
76
77 unsafe fn from_raw(raw: Self::Raw) -> Self {
78 use std::os::unix::prelude::FromRawFd;
79 unsafe { Self::from_raw_fd(raw) }
80 }
81}
82#[cfg(unix)]
83impl RawPipe for UnnamedPipeWriter {
84 type Raw = std::os::unix::io::RawFd;
85
86 fn raw(self) -> Self::Raw {
87 use std::os::unix::prelude::IntoRawFd;
88 self.into_raw_fd()
89 }
90
91 fn as_raw(&self) -> Self::Raw {
92 use std::os::unix::prelude::AsRawFd;
93 self.as_raw_fd()
94 }
95
96 fn close(self) {
97 use std::os::unix::prelude::IntoRawFd;
98 unsafe { libc::close(self.into_raw_fd()) };
99 }
100
101 unsafe fn from_raw(raw: Self::Raw) -> Self {
102 use std::os::unix::prelude::FromRawFd;
103 unsafe { Self::from_raw_fd(raw) }
104 }
105}