use std::sync::LazyLock;
use regex::Regex;
pub type Result<T> = std::result::Result<T, AdbError>;
#[derive(Debug, thiserror::Error)]
pub enum AdbError {
#[error("{0}")]
Adb(String),
#[error("adb timeout: {0}")]
Timeout(String),
#[error("adb connection error: {0}")]
Connection(String),
#[error("{output}")]
Install { reason: String, output: String },
#[error("adb sync error: {0}")]
Sync(String),
#[error(transparent)]
Io(#[from] std::io::Error),
}
impl AdbError {
pub fn adb(msg: impl Into<String>) -> Self {
AdbError::Adb(msg.into())
}
pub fn install(output: impl Into<String>) -> Self {
static RE: LazyLock<Regex> =
LazyLock::new(|| Regex::new(r"Failure \[([A-Z_]+).*\]").unwrap());
let output = output.into();
let reason = RE
.captures(&output)
.and_then(|c| c.get(1))
.map(|m| m.as_str().to_string())
.unwrap_or_else(|| "Unknown".to_string());
AdbError::Install { reason, output }
}
}