1use fmi::{
2    fmi2::{import::Fmi2Import, instance::InstanceME},
3    traits::FmiInstance,
4};
5
6use crate::{
7    Error,
8    sim::{
9        InputState, RecorderState, SimState, SimStateTrait,
10        io::StartValues,
11        params::SimParams,
12        traits::{InstSetValues, SimApplyStartValues},
13    },
14};
15
16impl<'a> SimStateTrait<'a, InstanceME<'a>, Fmi2Import> for SimState<InstanceME<'a>> {
17    fn new(
18        import: &'a Fmi2Import,
19        sim_params: SimParams,
20        input_state: InputState<InstanceME<'a>>,
21        recorder_state: RecorderState<InstanceME<'a>>,
22    ) -> Result<Self, Error> {
23        log::trace!("Instantiating ME Simulation: {sim_params:#?}");
24        let inst = import.instantiate_me("inst1", true, true)?;
25        Ok(Self {
26            sim_params,
27            input_state,
28            recorder_state,
29            inst,
30            next_event_time: None,
31        })
32    }
33}
34
35impl SimApplyStartValues<InstanceME<'_>> for SimState<InstanceME<'_>> {
36    fn apply_start_values(
37        &mut self,
38        start_values: &StartValues<<InstanceME as FmiInstance>::ValueRef>,
39    ) -> Result<(), Error> {
40        start_values.variables.iter().for_each(|(vr, ary)| {
41            self.inst.set_array(&[*vr], ary);
42        });
43        Ok(())
44    }
45}