pub mod beans;
pub mod client;
pub mod errors;
pub mod protocols;
pub mod utils;
pub use client::{AdbClient, AdbDevice};
pub use errors::{AdbError, AdbResult};
pub mod prelude {
pub use crate::beans::{AdbCommand, AppInfo, FileInfo, ForwardItem, NetworkType};
pub use crate::client::{AdbClient, AdbDevice};
pub use crate::errors::{AdbError, AdbResult, AdbResultExt};
pub use crate::utils::{get_free_port, start_adb_server};
#[cfg(feature = "tokio_async")]
pub use futures_util::StreamExt;
#[cfg(feature = "blocking")]
pub use std::net::TcpStream;
#[cfg(feature = "tokio_async")]
pub use tokio::net::TcpStream;
}
pub type Result<T> = std::result::Result<T, AdbError>;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub const DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
pub const AUTHORS: &str = env!("CARGO_PKG_AUTHORS");
pub mod info {
pub fn version() -> &'static str {
crate::VERSION
}
pub fn description() -> &'static str {
crate::DESCRIPTION
}
pub fn authors() -> &'static str {
crate::AUTHORS
}
pub fn print_info() {
println!("ADB Utils v{}", version());
println!("Description: {}", description());
println!("Authors: {}", authors());
}
}
pub mod util {
pub use crate::utils::*;
pub fn is_adb_server_running() -> bool {
use std::net::TcpStream;
TcpStream::connect("127.0.0.1:5037").is_ok()
}
pub fn ensure_adb_server() -> crate::AdbResult<()> {
if !is_adb_server_running() {
start_adb_server();
std::thread::sleep(std::time::Duration::from_millis(500));
}
Ok(())
}
#[cfg(feature = "blocking")]
pub fn get_adb_server_version() -> crate::AdbResult<String> {
let mut client = crate::AdbClient::default();
client.server_version()
}
#[cfg(feature = "tokio_async")]
pub async fn get_adb_server_version_async() -> crate::AdbResult<String> {
let mut client = crate::AdbClient::default().await;
client.server_version().await
}
}
#[cfg(feature = "blocking")]
pub mod blocking {
pub use crate::client::adb_client::blocking_impl::*;
pub use crate::client::adb_device::blocking_impl::*;
pub use crate::protocols::blocking::AdbProtocol;
}
#[cfg(feature = "tokio_async")]
pub mod r#async {
pub use crate::client::adb_client::async_impl::*;
pub use crate::client::adb_device::async_impl::*;
pub use crate::protocols::tokio_async::AdbProtocol;
}
pub mod builder {
use crate::prelude::*;
pub struct AdbClientBuilder {
addr: Option<String>,
timeout: Option<std::time::Duration>,
}
impl AdbClientBuilder {
pub fn new() -> Self {
Self {
addr: None,
timeout: None,
}
}
pub fn addr<S: Into<String>>(mut self, addr: S) -> Self {
self.addr = Some(addr.into());
self
}
pub fn timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
#[cfg(feature = "blocking")]
pub fn build(self) -> AdbResult<AdbClient> {
let addr = self.addr.unwrap_or_else(|| "127.0.0.1:5037".to_string());
Ok(AdbClient::new(addr))
}
#[cfg(feature = "tokio_async")]
pub async fn build_async(self) -> AdbResult<AdbClient> {
let addr = self.addr.unwrap_or_else(|| "127.0.0.1:5037".to_string());
Ok(AdbClient::new(addr).await)
}
}
impl Default for AdbClientBuilder {
fn default() -> Self {
Self::new()
}
}
}
#[cfg(test)]
pub mod test_utils {
use std::fmt::Debug;
use crate::prelude::*;
pub fn setup_test_env() {
crate::utils::start_adb_server();
std::thread::sleep(std::time::Duration::from_millis(500));
}
#[cfg(feature = "blocking")]
pub fn get_test_device() -> Option<AdbDevice<impl std::net::ToSocketAddrs + Clone + Debug>> {
let mut client = AdbClient::default();
client.list_devices().ok()?.into_iter().next()
}
#[cfg(feature = "tokio_async")]
pub async fn get_test_device_async(
) -> Option<AdbDevice<impl tokio::net::ToSocketAddrs + Clone + Debug>> {
let mut client = AdbClient::default().await;
client.list_devices().await.ok()?.into_iter().next()
}
}
#[macro_export]
macro_rules! adb_shell {
($device:expr, $($arg:expr),+) => {
$device.shell([$($arg),+])
};
}
#[macro_export]
macro_rules! adb_expect_device {
($client:expr) => {
$client
.list_devices()?
.into_iter()
.next()
.ok_or_else(|| $crate::AdbError::device_not_found("No devices found"))?
};
}
pub use anyhow;
pub use log;
#[cfg(feature = "tokio_async")]
pub use tokio;
#[cfg(feature = "blocking")]
pub use std::net;
#[cfg(doctest)]
doc_comment::doctest!("../README.md");
const _: fn() = || {
let version = VERSION;
assert!(version.len() > 0, "Version should not be empty");
};
#[cfg(all(feature = "blocking", feature = "tokio_async"))]
compile_error!("Cannot use both 'blocking' and 'tokio_async' features simultaneously");
#[cfg(not(any(feature = "blocking", feature = "tokio_async")))]
compile_error!("Must enable either 'blocking' or 'tokio_async' feature");
#[cfg(target_os = "android")]
compile_error!("This library is not intended to run on Android devices");
#[cfg(all(feature = "tokio_async", feature = "async-std"))]
compile_error!("Cannot use both Tokio and async-std features");
pub mod adb {
pub use crate::beans::*;
pub use crate::client::*;
pub use crate::errors::*;
pub use crate::prelude::*;
}