use super::{Message, ScriptInfo, ScriptType};
use std::io::Write;
pub trait Scripter {
fn name() -> &'static str;
fn script_type() -> ScriptType;
fn hooks() -> &'static [&'static str];
fn execute(func: &mut dyn FnMut(&str)) {
let mut stdin = std::io::stdin();
let mut stdout = std::io::stdout();
let message: Message = bincode::deserialize_from(&mut stdin).unwrap();
if message == Message::Greeting {
let metadata = ScriptInfo::new(Self::name(), Self::script_type(), Self::hooks());
bincode::serialize_into(&mut stdout, &metadata).unwrap();
stdout.flush().unwrap();
if matches!(Self::script_type(), ScriptType::OneShot) {
std::process::exit(0);
}
} else {
}
loop {
if matches!(Self::script_type(), ScriptType::Daemon) {
let _message: Message = bincode::deserialize_from(&mut stdin).unwrap();
}
let hook_name: String = bincode::deserialize_from(&mut stdin).unwrap();
func(&hook_name);
std::io::stdout().flush().unwrap();
if matches!(Self::script_type(), ScriptType::OneShot) {
return;
}
}
}
}