use std::path::PathBuf;
use ixa::people::PersonPropertyChangeEvent;
use ixa::prelude::*;
use serde::{Deserialize, Serialize};
use crate::{InfectionStatus, InfectionStatusValue, Parameters};
#[derive(Serialize, Deserialize, Clone)]
struct IncidenceReportItem {
time: f64,
person_id: String,
infection_status: InfectionStatusValue,
}
define_report!(IncidenceReportItem);
fn handle_infection_status_change(
context: &mut Context,
event: PersonPropertyChangeEvent<InfectionStatus>,
) {
context.send_report(IncidenceReportItem {
time: context.get_current_time(),
person_id: format!("{}", event.person_id),
infection_status: event.current,
});
}
pub fn init(context: &mut Context) -> Result<(), IxaError> {
let parameters = context
.get_global_property_value(Parameters)
.unwrap()
.clone();
let mut output_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
output_dir = output_dir.join(parameters.output_dir.clone());
context
.report_options()
.directory(output_dir)
.overwrite(true); context.add_report::<IncidenceReportItem>(¶meters.output_file)?;
context.subscribe_to_event(
|context, event: PersonPropertyChangeEvent<InfectionStatus>| {
handle_infection_status_change(context, event);
},
);
Ok(())
}