1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use super::ModelMessage;
use crate::simulator::Services;
use crate::utils::error::SimulationError;
pub trait ModelClone {
fn clone_box(&self) -> Box<dyn AsModel>;
}
impl<T> ModelClone for T
where
T: 'static + AsModel + Clone,
{
fn clone_box(&self) -> Box<dyn AsModel> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn AsModel> {
fn clone(&self) -> Box<dyn AsModel> {
self.clone_box()
}
}
pub trait SerializableModel {
fn get_type(&self) -> &'static str {
"Model"
}
fn serialize(&self) -> serde_yaml::Value {
serde_yaml::Value::Null
}
}
pub trait AsModel: ModelClone + SerializableModel {
fn status(&self) -> String;
fn events_ext(
&mut self,
incoming_message: &ModelMessage,
services: &mut Services,
) -> Result<(), SimulationError>;
fn events_int(&mut self, services: &mut Services)
-> Result<Vec<ModelMessage>, SimulationError>;
fn time_advance(&mut self, time_delta: f64);
fn until_next_event(&self) -> f64;
}