use std::collections::HashMap;
use std::sync::{Arc, Mutex};
pub struct ParoApp<State> {
callbacks: HashMap<String, Arc<Mutex<dyn FnMut(&mut State) + Send + 'static>>>,
pub state: State,
}
impl <State> ParoApp<State> {
pub fn new(state: State) -> ParoApp<State> {
ParoApp::<State> {
callbacks: HashMap::new(),
state: state,
}
}
pub fn insert(&mut self, id: String, callback: Arc<Mutex<dyn FnMut(&mut State) + Send + 'static>>) -> () {
if self.callbacks.contains_key(&id) {
panic!("[paro] callback ids must be unique, '{}' is not", &id);
}
self.callbacks.insert(id, callback);
}
pub fn clear(&mut self) -> () {
self.callbacks.clear();
}
pub fn call(&mut self, id: String) -> Result<(), String> {
match self.callbacks.get(&id) {
Some(callback) => {
println!("before lock");
let mut locked = { callback.lock().unwrap() };
println!("after lock");
let result = Ok(locked(&mut self.state));
println!("after call");
return result;
},
None => Err(format!("[paro] callback '{}' not found", &id))
}
}
}
#[macro_export]
macro_rules! event {
($paroApp:expr, $closure:tt)=>{
{
let callback_id = uuid::Uuid::new_v4().to_string();
{
$paroApp.lock().unwrap().insert(
callback_id.clone(),
Arc::new(Mutex::new(($closure)))
);
}
let javascript_call = format!{"window.__PARO__.emitEvent(\"{}\")", &callback_id};
javascript_call
}
}
}