@@ -259,7 +259,7 @@ use std::os::unix::process::CommandExt;
259
259
use std:: os:: windows:: process:: CommandExt ;
260
260
261
261
cfg_windows ! {
262
- use crate :: os:: windows:: io:: { AsRawHandle , RawHandle , AsHandle , BorrowedHandle } ;
262
+ use crate :: os:: windows:: io:: { AsRawHandle , RawHandle } ;
263
263
}
264
264
265
265
/// This structure mimics the API of [`std::process::Command`] found in the standard library, but
@@ -1447,84 +1447,100 @@ impl TryInto<Stdio> for ChildStderr {
1447
1447
}
1448
1448
1449
1449
#[ cfg( unix) ]
1450
+ #[ cfg_attr( docsrs, doc( cfg( unix) ) ) ]
1450
1451
mod sys {
1451
- use std:: os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , RawFd } ;
1452
+ use std:: {
1453
+ io,
1454
+ os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , OwnedFd , RawFd } ,
1455
+ } ;
1452
1456
1453
1457
use super :: { ChildStderr , ChildStdin , ChildStdout } ;
1454
1458
1455
- impl AsRawFd for ChildStdin {
1456
- fn as_raw_fd ( & self ) -> RawFd {
1457
- self . inner . as_raw_fd ( )
1458
- }
1459
- }
1460
-
1461
- impl AsFd for ChildStdin {
1462
- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
1463
- unsafe { BorrowedFd :: borrow_raw ( self . as_raw_fd ( ) ) }
1464
- }
1465
- }
1466
-
1467
- impl AsRawFd for ChildStdout {
1468
- fn as_raw_fd ( & self ) -> RawFd {
1469
- self . inner . as_raw_fd ( )
1470
- }
1471
- }
1459
+ macro_rules! impl_traits {
1460
+ ( $type: ty) => {
1461
+ impl $type {
1462
+ /// Convert into [`OwnedFd`].
1463
+ pub fn into_owned_fd( self ) -> io:: Result <OwnedFd > {
1464
+ self . inner. into_owned_fd( )
1465
+ }
1466
+ }
1472
1467
1473
- impl AsFd for ChildStdout {
1474
- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
1475
- unsafe { BorrowedFd :: borrow_raw ( self . as_raw_fd ( ) ) }
1476
- }
1477
- }
1468
+ impl AsRawFd for $type {
1469
+ fn as_raw_fd ( & self ) -> RawFd {
1470
+ self . inner . as_raw_fd( )
1471
+ }
1472
+ }
1478
1473
1479
- impl AsRawFd for ChildStderr {
1480
- fn as_raw_fd ( & self ) -> RawFd {
1481
- self . inner . as_raw_fd ( )
1482
- }
1474
+ impl AsFd for $type {
1475
+ fn as_fd( & self ) -> BorrowedFd <' _> {
1476
+ unsafe { BorrowedFd :: borrow_raw( self . as_raw_fd( ) ) }
1477
+ }
1478
+ }
1479
+ } ;
1483
1480
}
1484
1481
1485
- impl AsFd for ChildStderr {
1486
- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
1487
- unsafe { BorrowedFd :: borrow_raw ( self . as_raw_fd ( ) ) }
1488
- }
1489
- }
1482
+ impl_traits ! ( ChildStdin ) ;
1483
+ impl_traits ! ( ChildStdout ) ;
1484
+ impl_traits ! ( ChildStderr ) ;
1490
1485
}
1491
1486
1492
- cfg_windows ! {
1493
- impl AsRawHandle for ChildStdin {
1494
- fn as_raw_handle( & self ) -> RawHandle {
1495
- self . inner. as_raw_handle( )
1496
- }
1497
- }
1487
+ #[ cfg( any( windows, docsrs) ) ]
1488
+ #[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
1489
+ mod windows {
1490
+ use super :: * ;
1491
+ use crate :: os:: windows:: io:: { AsHandle , AsRawHandle , BorrowedHandle , OwnedHandle , RawHandle } ;
1492
+
1493
+ #[ cfg( not( docsrs) ) ]
1494
+ macro_rules! impl_traits {
1495
+ ( $type: ty) => {
1496
+ impl $type {
1497
+ /// Convert into [`OwnedHandle`].
1498
+ pub fn into_owned_handle( self ) -> io:: Result <OwnedHandle > {
1499
+ self . inner. into_owned_handle( )
1500
+ }
1501
+ }
1498
1502
1499
- impl AsHandle for ChildStdin {
1500
- fn as_handle ( & self ) -> BorrowedHandle < ' _> {
1501
- unsafe { BorrowedHandle :: borrow_raw ( self . as_raw_handle( ) ) }
1502
- }
1503
- }
1503
+ impl AsRawHandle for $type {
1504
+ fn as_raw_handle ( & self ) -> RawHandle {
1505
+ self . inner . as_raw_handle( )
1506
+ }
1507
+ }
1504
1508
1505
- impl AsRawHandle for ChildStdout {
1506
- fn as_raw_handle( & self ) -> RawHandle {
1507
- self . inner. as_raw_handle( )
1508
- }
1509
+ impl AsHandle for $type {
1510
+ fn as_handle( & self ) -> BorrowedHandle <' _> {
1511
+ unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1512
+ }
1513
+ }
1514
+ } ;
1509
1515
}
1510
1516
1511
- impl AsHandle for ChildStdout {
1512
- fn as_handle( & self ) -> BorrowedHandle <' _> {
1513
- unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1514
- }
1515
- }
1517
+ #[ cfg( docsrs) ]
1518
+ macro_rules! impl_traits {
1519
+ ( $type: ty) => {
1520
+ impl $type {
1521
+ /// Convert into [`OwnedHandle`].
1522
+ pub fn into_owned_handle( self ) -> io:: Result <OwnedHandle > {
1523
+ todo!( "For doc generation only" )
1524
+ }
1525
+ }
1516
1526
1517
- impl AsRawHandle for ChildStderr {
1518
- fn as_raw_handle( & self ) -> RawHandle {
1519
- self . inner . as_raw_handle ( )
1520
- }
1521
- }
1527
+ impl AsRawHandle for $type {
1528
+ fn as_raw_handle( & self ) -> RawHandle {
1529
+ todo! ( "For doc generation only" )
1530
+ }
1531
+ }
1522
1532
1523
- impl AsHandle for ChildStderr {
1524
- fn as_handle( & self ) -> BorrowedHandle <' _> {
1525
- unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1526
- }
1533
+ impl AsHandle for $type {
1534
+ fn as_handle( & self ) -> BorrowedHandle <' _> {
1535
+ todo!( "For doc generation only" )
1536
+ }
1537
+ }
1538
+ } ;
1527
1539
}
1540
+
1541
+ impl_traits ! ( ChildStdin ) ;
1542
+ impl_traits ! ( ChildStdout ) ;
1543
+ impl_traits ! ( ChildStderr ) ;
1528
1544
}
1529
1545
1530
1546
#[ cfg( all( test, not( loom) ) ) ]
0 commit comments