use std::{fmt::Display, process::Command};
use crate::{ADBCommand, ADBResult};
pub struct ADBForward {
shell: Command,
}
pub enum ForwardMethodLocal {
Tcp(u32),
LocalAbstract(UDS),
LocalReserved(UDS),
LocalFilesystem(UDS),
}
pub enum ForwardMethodRemote {
Tcp(u32),
Jdwp(u32),
Vsock(u32, u32),
}
impl ADBForward {
pub fn list() -> Self {
let mut cmd = Command::new("adb");
cmd.arg("forward").arg("--list");
ADBForward { shell: cmd }
}
pub fn using(local: ForwardMethodLocal, remote: ForwardMethodRemote) -> Self {
let mut cmd = Command::new("adb");
cmd.arg(match local {
ForwardMethodLocal::Tcp(port) => format!("tcp:{port}"),
ForwardMethodLocal::LocalAbstract(uds) => format!("localabstract:{uds}"),
ForwardMethodLocal::LocalReserved(uds) => format!("localreserved:{uds}"),
ForwardMethodLocal::LocalFilesystem(uds) => format!("localfilesystem:{uds}"),
});
cmd.arg(match remote {
ForwardMethodRemote::Tcp(port) => format!("tcp:{port}"),
ForwardMethodRemote::Jdwp(pid) => format!("jdwp:{pid}"),
ForwardMethodRemote::Vsock(cid, pid) => format!("vsock:{cid}:{pid}"),
});
ADBForward { shell: cmd }
}
}
impl ADBCommand for ADBForward {
fn build(&mut self) -> Result<&mut Command, String> {
Ok(&mut self.shell)
}
fn process_output(&self, output: ADBResult) -> ADBResult {
output
}
}
pub enum UDS {
SockStream,
SockDgram,
SockSeqpacket,
}
impl Display for UDS {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
UDS::SockStream => "SOCK_STREAM",
UDS::SockDgram => "SOCK_DGRAM",
UDS::SockSeqpacket => "SOCK_SEQPACKET",
}
)
}
}