1#[cfg(windows)]
6use crate::os::windows::{
7    AsHandleOrSocket, AsRawHandleOrSocket, AsRawReadWriteHandleOrSocket, AsReadWriteHandleOrSocket,
8    BorrowedHandleOrSocket, FromRawHandleOrSocket, IntoRawHandleOrSocket, OwnedHandleOrSocket,
9    RawHandleOrSocket,
10};
11#[cfg(not(windows))]
12use {
13    crate::os::rustix::{AsRawFd, AsRawReadWriteFd, AsReadWriteFd, FromRawFd, IntoRawFd, RawFd},
14    io_lifetimes::{AsFd, BorrowedFd, OwnedFd},
15};
16
17#[cfg(not(windows))]
19pub type BorrowedGrip<'a> = BorrowedFd<'a>;
20#[cfg(not(windows))]
22pub type OwnedGrip = OwnedFd;
23
24#[cfg(windows)]
26pub type BorrowedGrip<'a> = BorrowedHandleOrSocket<'a>;
27#[cfg(windows)]
29pub type OwnedGrip = OwnedHandleOrSocket;
30
31#[cfg(not(windows))]
33pub trait AsGrip: AsFd {
34    fn as_grip(&self) -> BorrowedGrip<'_>;
36}
37
38#[cfg(windows)]
40pub trait AsGrip: AsHandleOrSocket {
41    fn as_grip(&self) -> BorrowedGrip<'_>;
43}
44
45#[cfg(not(windows))]
48pub trait AsReadWriteGrip: AsReadWriteFd {
49    fn as_read_grip(&self) -> BorrowedGrip<'_>;
54
55    fn as_write_grip(&self) -> BorrowedGrip<'_>;
60}
61
62#[cfg(windows)]
65pub trait AsReadWriteGrip: AsReadWriteHandleOrSocket {
66    fn as_read_grip(&self) -> BorrowedGrip<'_>;
71
72    fn as_write_grip(&self) -> BorrowedGrip<'_>;
77}
78
79#[cfg(not(windows))]
82pub trait IntoGrip: Into<OwnedFd> {
83    fn into_grip(self) -> OwnedGrip;
85}
86
87#[cfg(windows)]
90pub trait IntoGrip: Into<OwnedHandleOrSocket> {
91    fn into_grip(self) -> OwnedGrip;
93}
94
95#[cfg(not(windows))]
98pub trait FromGrip: From<OwnedFd> {
99    fn from_grip(owned_grip: OwnedGrip) -> Self;
101}
102
103#[cfg(windows)]
106pub trait FromGrip: From<OwnedHandleOrSocket> {
107    fn from_grip(owned_grip: OwnedGrip) -> Self;
109}
110
111#[cfg(not(windows))]
112impl<T: AsFd> AsGrip for T {
113    #[inline]
114    fn as_grip(&self) -> BorrowedGrip<'_> {
115        self.as_fd()
116    }
117}
118
119#[cfg(windows)]
120impl<T: AsHandleOrSocket> AsGrip for T {
121    #[inline]
122    fn as_grip(&self) -> BorrowedGrip<'_> {
123        self.as_handle_or_socket()
124    }
125}
126
127#[cfg(not(windows))]
128impl<T: AsReadWriteFd> AsReadWriteGrip for T {
129    #[inline]
130    fn as_read_grip(&self) -> BorrowedGrip<'_> {
131        self.as_read_fd()
132    }
133
134    #[inline]
135    fn as_write_grip(&self) -> BorrowedGrip<'_> {
136        self.as_write_fd()
137    }
138}
139
140#[cfg(windows)]
141impl<T: AsReadWriteHandleOrSocket> AsReadWriteGrip for T {
142    #[inline]
143    fn as_read_grip(&self) -> BorrowedGrip<'_> {
144        self.as_read_handle_or_socket()
145    }
146
147    #[inline]
148    fn as_write_grip(&self) -> BorrowedGrip<'_> {
149        self.as_write_handle_or_socket()
150    }
151}
152
153#[cfg(not(windows))]
154impl<T: Into<OwnedFd>> IntoGrip for T {
155    #[inline]
156    fn into_grip(self) -> OwnedGrip {
157        self.into()
158    }
159}
160
161#[cfg(windows)]
162impl<T: Into<OwnedHandleOrSocket>> IntoGrip for T {
163    #[inline]
164    fn into_grip(self) -> OwnedGrip {
165        self.into()
166    }
167}
168
169#[cfg(not(windows))]
170impl<T: From<OwnedFd>> FromGrip for T {
171    #[inline]
172    fn from_grip(owned_grip: OwnedGrip) -> Self {
173        Self::from(owned_grip)
174    }
175}
176
177#[cfg(windows)]
178impl<T: From<OwnedHandleOrSocket>> FromGrip for T {
179    #[inline]
180    fn from_grip(owned_grip: OwnedGrip) -> Self {
181        Self::from(owned_grip)
182    }
183}
184
185#[cfg(not(windows))]
187pub type RawGrip = RawFd;
188
189#[cfg(windows)]
191pub type RawGrip = RawHandleOrSocket;
192
193#[cfg(not(windows))]
195pub trait AsRawGrip: AsRawFd {
196    fn as_raw_grip(&self) -> RawGrip;
198}
199
200#[cfg(windows)]
202pub trait AsRawGrip: AsRawHandleOrSocket {
203    fn as_raw_grip(&self) -> RawGrip;
205}
206
207#[cfg(not(windows))]
210pub trait AsRawReadWriteGrip: AsRawReadWriteFd {
211    fn as_raw_read_grip(&self) -> RawGrip;
216
217    fn as_raw_write_grip(&self) -> RawGrip;
222}
223
224#[cfg(windows)]
227pub trait AsRawReadWriteGrip: AsRawReadWriteHandleOrSocket {
228    fn as_raw_read_grip(&self) -> RawGrip;
233
234    fn as_raw_write_grip(&self) -> RawGrip;
239}
240
241#[cfg(not(windows))]
244pub trait IntoRawGrip: IntoRawFd {
245    fn into_raw_grip(self) -> RawGrip;
247}
248
249#[cfg(windows)]
252pub trait IntoRawGrip: IntoRawHandleOrSocket {
253    fn into_raw_grip(self) -> RawGrip;
255}
256
257#[cfg(not(windows))]
260pub trait FromRawGrip: FromRawFd {
261    unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self;
267}
268
269#[cfg(windows)]
272pub trait FromRawGrip: FromRawHandleOrSocket {
273    unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self;
279}
280
281#[cfg(not(windows))]
282impl<T: AsRawFd> AsRawGrip for T {
283    #[inline]
284    fn as_raw_grip(&self) -> RawGrip {
285        self.as_raw_fd()
286    }
287}
288
289#[cfg(windows)]
290impl<T: AsRawHandleOrSocket> AsRawGrip for T {
291    #[inline]
292    fn as_raw_grip(&self) -> RawGrip {
293        self.as_raw_handle_or_socket()
294    }
295}
296
297#[cfg(not(windows))]
298impl<T: AsRawReadWriteFd> AsRawReadWriteGrip for T {
299    #[inline]
300    fn as_raw_read_grip(&self) -> RawGrip {
301        self.as_raw_read_fd()
302    }
303
304    #[inline]
305    fn as_raw_write_grip(&self) -> RawGrip {
306        self.as_raw_write_fd()
307    }
308}
309
310#[cfg(windows)]
311impl<T: AsRawReadWriteHandleOrSocket> AsRawReadWriteGrip for T {
312    #[inline]
313    fn as_raw_read_grip(&self) -> RawGrip {
314        self.as_raw_read_handle_or_socket()
315    }
316
317    #[inline]
318    fn as_raw_write_grip(&self) -> RawGrip {
319        self.as_raw_write_handle_or_socket()
320    }
321}
322
323#[cfg(not(windows))]
324impl<T: IntoRawFd> IntoRawGrip for T {
325    #[inline]
326    fn into_raw_grip(self) -> RawGrip {
327        self.into_raw_fd()
328    }
329}
330
331#[cfg(windows)]
332impl<T: IntoRawHandleOrSocket> IntoRawGrip for T {
333    #[inline]
334    fn into_raw_grip(self) -> RawGrip {
335        self.into_raw_handle_or_socket()
336    }
337}
338
339#[cfg(not(windows))]
340impl<T: FromRawFd> FromRawGrip for T {
341    #[inline]
342    unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self {
343        Self::from_raw_fd(raw_grip)
344    }
345}
346
347#[cfg(windows)]
348impl<T: FromRawHandleOrSocket> FromRawGrip for T {
349    #[inline]
350    unsafe fn from_raw_grip(raw_grip: RawGrip) -> Self {
351        Self::from_raw_handle_or_socket(raw_grip)
352    }
353}
354
355#[cfg(not(windows))]
364#[must_use]
365#[inline]
366pub unsafe fn borrow_raw<'a>(grip: RawGrip) -> BorrowedGrip<'a> {
367    BorrowedFd::borrow_raw(grip)
368}
369
370#[cfg(windows)]
381#[must_use]
382#[inline]
383pub unsafe fn borrow_raw<'a>(grip: RawGrip) -> BorrowedGrip<'a> {
384    BorrowedHandleOrSocket::borrow_raw(grip)
385}