use std::sync::RwLock;
use super::EventDispatcher;
use crate::event_api::request::{Request, Visitor};
use crate::{client::UserContext, Conversion, Decision};
pub struct SimpleEventDispatcher {
request: RwLock<Request>,
}
impl SimpleEventDispatcher {
pub fn new(datafile: &crate::datafile::Datafile) -> SimpleEventDispatcher {
let request = RwLock::new(Request::new(datafile));
SimpleEventDispatcher { request }
}
}
impl EventDispatcher for SimpleEventDispatcher {
fn send_conversion_event(&self, user_context: &UserContext, conversion: Conversion) {
log::debug!("Sending conversion event to Event API");
let mut request = match self.request.try_write() {
Ok(request) => request,
Err(_) => {
log::error!("Unable to dispatch concurrently");
return;
}
};
let visitor = Visitor::from(user_context);
request.add_conversion_event(visitor, conversion);
request.send()
}
fn send_decision_event(&self, user_context: &UserContext, decision: Decision) {
log::debug!("Sending decision event to Event API");
let mut request = match self.request.try_write() {
Ok(request) => request,
Err(_) => {
log::error!("Unable to dispatch concurrently");
return;
}
};
let visitor = Visitor::from(user_context);
request.add_decision_event(visitor, decision);
request.send()
}
}