use crate::MajorVersion;
pub trait DefaultExperiment {
fn start_time(&self) -> Option<f64>;
fn stop_time(&self) -> Option<f64>;
fn tolerance(&self) -> Option<f64>;
fn step_size(&self) -> Option<f64>;
}
pub trait FmiModelDescription: Sized {
fn model_name(&self) -> &str;
fn version_string(&self) -> &str;
fn version(&self) -> Result<semver::Version, crate::Error> {
lenient_semver::parse(self.version_string()).map_err(|e| e.owned().into())
}
fn major_version(&self) -> Result<MajorVersion, crate::Error> {
match self.version()? {
v if v.major == 1 => Ok(MajorVersion::FMI1),
v if v.major == 2 => Ok(MajorVersion::FMI2),
v if v.major == 3 => Ok(MajorVersion::FMI3),
v => panic!("Invalid version {}", v.major),
}
}
fn deserialize(xml: &str) -> Result<Self, crate::Error>;
fn serialize(&self) -> Result<String, crate::Error>;
}
pub trait FmiInterfaceType: Sized {
fn model_identifier(&self) -> &str;
fn needs_execution_tool(&self) -> Option<bool>;
fn can_be_instantiated_only_once_per_process(&self) -> Option<bool>;
fn can_get_and_set_fmu_state(&self) -> Option<bool>;
fn can_serialize_fmu_state(&self) -> Option<bool>;
fn provides_directional_derivatives(&self) -> Option<bool>;
fn provides_adjoint_derivatives(&self) -> Option<bool>;
fn provides_per_element_dependencies(&self) -> Option<bool>;
}