gmt_dos_actors/model/
unknown.rs

1use crate::framework::model::Task;
2
3use super::{Actors, Model, ModelError, Ready, Result, Unknown};
4use std::{marker::PhantomData, time::Instant};
5
6impl Default for Model<Unknown> {
7    fn default() -> Self {
8        Self {
9            name: Default::default(),
10            actors: Default::default(),
11            task_handles: Default::default(),
12            state: Default::default(),
13            start: Instant::now(),
14            verbose: true,
15            elapsed_time: Default::default(),
16        }
17    }
18}
19
20impl FromIterator<Box<dyn Task>> for Model<Unknown> {
21    fn from_iter<T: IntoIterator<Item = Box<dyn Task>>>(iter: T) -> Self {
22        Self {
23            actors: Some(iter.into_iter().collect()),
24            ..Default::default()
25        }
26    }
27}
28
29impl Model<Unknown> {
30    /// Returns a new model
31    pub fn new(actors: Actors) -> Self {
32        Self {
33            name: None,
34            actors: Some(actors),
35            task_handles: None,
36            state: PhantomData,
37            start: Instant::now(),
38            verbose: true,
39            elapsed_time: Default::default(),
40        }
41    }
42    /// Sets the model name
43    pub fn name<S: Into<String>>(self, name: S) -> Self {
44        Self {
45            name: Some(name.into()),
46            ..self
47        }
48    }
49    /// Quiet mode
50    pub fn quiet(mut self) -> Self {
51        self.verbose = false;
52        self
53    }
54    /// Validates actors inputs and outputs
55    pub fn check(self) -> Result<Model<Ready>> {
56        let (n_inputs, n_outputs) = self.n_io();
57        let name = self.name.clone().unwrap_or_default();
58        assert_eq!(
59            n_inputs, n_outputs,
60            "{} I/O #({},{}) don't match, did you forget to add some actors to the model:\n{}",
61            name, n_inputs, n_outputs, self
62        );
63        match self.actors {
64            Some(ref actors) => {
65                let mut inputs_hashes = vec![];
66                let mut outputs_hashes = vec![];
67                for actor in actors {
68                    actor.check_inputs().map_err(Box::new)?;
69                    actor.check_outputs().map_err(Box::new)?;
70                    inputs_hashes.append(&mut actor.inputs_hashes());
71                    outputs_hashes.append(&mut actor.outputs_hashes());
72                }
73                let hashes_diff = outputs_hashes
74                    .into_iter()
75                    .zip(inputs_hashes)
76                    .map(|(o, i)| o as i128 - i as i128)
77                    .sum::<i128>();
78                assert_eq!(hashes_diff,0i128,
79                "{} I/O hashes difference: expected 0, found {}, did you forget to add some actors to the model?",
80                self.name.unwrap_or_default(),
81                hashes_diff);
82                Ok(Model::<Ready> {
83                    name: self.name,
84                    actors: self.actors,
85                    task_handles: None,
86                    state: PhantomData,
87                    start: Instant::now(),
88                    verbose: self.verbose,
89                    elapsed_time: Default::default(),
90                })
91            }
92            None => Err(ModelError::NoActors),
93        }
94    }
95    pub fn skip_check(self) -> Model<Ready> {
96        Model::<Ready> {
97            name: self.name,
98            actors: self.actors,
99            task_handles: None,
100            state: PhantomData,
101            start: Instant::now(),
102            verbose: self.verbose,
103            elapsed_time: Default::default(),
104        }
105    }
106}