use std::io::{self};
use std::pin::Pin;
use std::task::{Context, Poll};
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
pub enum StdinWrapper {
OpensshStdin(openssh::ChildStdin),
TokioStdin(tokio::process::ChildStdin),
}
impl AsyncWrite for StdinWrapper {
fn poll_write(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
buf: &[u8]
) -> Poll<io::Result<usize>> {
let this = self.get_mut();
match this {
StdinWrapper::OpensshStdin(stdin) => {
Pin::new(stdin).poll_write(_cx, buf)
},
StdinWrapper::TokioStdin(stdin) => {
Pin::new(stdin).poll_write(_cx, buf)
},
}
}
fn poll_flush(
self: Pin<&mut Self>,
_cx: &mut Context<'_>
) -> Poll<io::Result<()>> {
let this = self.get_mut();
match this {
StdinWrapper::OpensshStdin(stdin) => {
Pin::new(stdin).poll_flush(_cx)
},
StdinWrapper::TokioStdin(stdin) => {
Pin::new(stdin).poll_flush(_cx)
},
}
}
fn poll_shutdown(
self: Pin<&mut Self>,
_cx: &mut Context<'_>
) -> Poll<io::Result<()>> {
let this = self.get_mut();
match this {
StdinWrapper::OpensshStdin(stdin) => {
Pin::new(stdin).poll_shutdown(_cx)
},
StdinWrapper::TokioStdin(stdin) => {
Pin::new(stdin).poll_shutdown(_cx)
},
}
}
}
impl From<openssh::ChildStdin> for StdinWrapper {
fn from(stdin: openssh::ChildStdin) -> Self {
StdinWrapper::OpensshStdin(stdin)
}
}
impl From<tokio::process::ChildStdin> for StdinWrapper {
fn from(stdin: tokio::process::ChildStdin) -> Self {
StdinWrapper::TokioStdin(stdin)
}
}
pub enum StdoutWrapper {
OpensshStdout(openssh::ChildStdout),
TokioStdout(tokio::process::ChildStdout),
}
impl AsyncRead for StdoutWrapper {
fn poll_read(
self: Pin<&mut Self>,
_cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>
) -> Poll<io::Result<()>> {
let this = self.get_mut();
match this {
StdoutWrapper::OpensshStdout(stdout) => {
Pin::new(stdout).poll_read(_cx, buf)
},
StdoutWrapper::TokioStdout(stdout) => {
Pin::new(stdout).poll_read(_cx, buf)
},
}
}
}
impl From<openssh::ChildStdout> for StdoutWrapper {
fn from(stdout: openssh::ChildStdout) -> Self {
StdoutWrapper::OpensshStdout(stdout)
}
}
impl From<tokio::process::ChildStdout> for StdoutWrapper {
fn from(stdout: tokio::process::ChildStdout) -> Self {
StdoutWrapper::TokioStdout(stdout)
}
}