gmt_dos_actors/model/
unknown.rs1use 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 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 pub fn name<S: Into<String>>(self, name: S) -> Self {
44 Self {
45 name: Some(name.into()),
46 ..self
47 }
48 }
49 pub fn quiet(mut self) -> Self {
51 self.verbose = false;
52 self
53 }
54 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}