aboutsummaryrefslogblamecommitdiffstats
path: root/src/lib.rs
blob: e8b2e26f9a2be82b7fa50c073b7cb52a935a0330 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                                                          






                                                                       




                                                  
                                                       










                                                                 

       
                                                                              

                                                                             





                                                                              



                                                                             
                                                                       
 


                          
                                
                            





                                         
                                  
 
          
                               



                    
 




                         
                         


                         
                                                                        
//! This crate is a wrapper around [`tokio::process::Command`] or
//! [`std::process::Command`] which provides the ability to allocate a pty
//! and spawn new processes attached to that pty, with the pty as their
//! controlling terminal. This allows for manipulation of interactive
//! programs.
//!
//! The basic functionality looks like this:
//!
//! ```no_run
//! # #[cfg(feature = "async")]
//! # #[tokio::main]
//! # async fn main() -> pty_process::Result<()> {
//! let mut pty = pty_process::Pty::new()?;
//! pty.resize(pty_process::Size::new(24, 80))?;
//! let mut cmd = pty_process::Command::new("nethack");
//! let child = cmd.spawn(&pty.pts()?)?;
//! # Ok(())
//! # }
//! # #[cfg(not(feature = "async"))]
//! # fn main() -> pty_process::Result<()> {
//! let mut pty = pty_process::blocking::Pty::new()?;
//! pty.resize(pty_process::Size::new(24, 80))?;
//! let mut cmd = pty_process::blocking::Command::new("nethack");
//! let child = cmd.spawn(&pty.pts()?)?;
//! # Ok(())
//! # }
//! ```
//!
//! The returned `child` is a normal instance of [`tokio::process::Child`] (or
//! [`std::process::Child`] for the [`blocking`](crate::blocking) variant),
//! with its `stdin`/`stdout`/`stderr` file descriptors pointing at the given
//! pty. The `pty` instance implements [`tokio::io::AsyncRead`] and
//! [`tokio::io::AsyncWrite`] (or [`std::io::Read`] and [`std::io::Write`] for
//! the [`blocking`] variant), and can be used to communicate with the child
//! process. The child process will also be made a session leader of a new
//! session, and the controlling terminal of that session will be set to the
//! given pty.
//!
//! # Features
//!
//! By default, only the [`blocking`](crate::blocking) APIs are available. To
//! include the asynchronous APIs, you must enable the `async` feature.

#![warn(clippy::cargo)]
#![warn(clippy::pedantic)]
#![warn(clippy::nursery)]
#![warn(clippy::as_conversions)]
#![warn(clippy::get_unwrap)]
#![allow(clippy::cognitive_complexity)]
#![allow(clippy::missing_const_for_fn)]
#![allow(clippy::similar_names)]
#![allow(clippy::struct_excessive_bools)]
#![allow(clippy::too_many_arguments)]
#![allow(clippy::too_many_lines)]
#![allow(clippy::type_complexity)]

mod error;
pub use error::{Error, Result};
mod types;
pub use types::Size;

mod sys;

pub mod blocking;

#[cfg(feature = "async")]
mod command;
#[cfg(feature = "async")]
pub use command::Command;
#[cfg(feature = "async")]
mod pty;
#[cfg(feature = "async")]
pub use pty::{OwnedReadPty, OwnedWritePty, Pts, Pty, ReadPty, WritePty};