use std::boxed::Box;
use std::collections::HashMap;
use std::process::{Child, Command, Output};
use std::sync::Arc;
use std::sync::Mutex;
use tokio::io::{AsyncBufReadExt, BufReader};
pub trait ADBPlugin {
fn new(cmd: String) -> Self;
fn set_plugin(self, status: String, fnc: Box<dyn FnMut(String)>);
fn use_plugin(self, status: String) -> Box<dyn FnMut(String)>;
async fn use_cmd(self, args: Vec<&str>);
}
#[derive(Debug )]
pub struct ADBPluginImpl {
plugins: HashMap<String, Arc<Mutex<Box<dyn FnMut(String)>>>>,
cmd: Command,
}
impl ADBPlugin for ADBPluginImpl {
fn new(cmd: String) -> Self {
ADBPluginImpl {
plugins: HashMap::new(),
cmd: Command::new(cmd),
}
}
fn set_plugin(mut self, status: String, fnc: Box<dyn FnMut(String)>) {
self.plugins.insert(status, Arc::new(Mutex::new(fnc)));
}
fn use_plugin(self, status: String) -> Box<dyn FnMut(String)> {
if let Some(fnc) = self.plugins.get(&status) {
let fnc_clone = fnc.clone();
Box::new(move |_| {
let mut fnc_lock = fnc_clone.lock().unwrap();
fnc_lock("/* String */".to_string())
})
} else {
Box::new(|_| {
"".to_string();
})
}
}
async fn use_cmd(mut self, args: Vec<&str>) {
let mut s = self.use_plugin("status".to_string());
if let Some(stdout) = self
.cmd
.args(args)
.stdout(std::process::Stdio::piped()) .spawn() .expect("failed to execute command")
.stdout
.take()
{}
}
}