Skip to main content

gmt_dos_actors/model/
ready.rs

1use super::{Model, Ready, Running};
2use chrono::{DateTime, Local, SecondsFormat};
3use std::{marker::PhantomData, time::Instant};
4
5impl Model<Ready> {
6    /// Spawns each actor task
7    pub fn run(self) -> Model<Running> {
8        let now: DateTime<Local> = Local::now();
9        self.verbose.then(|| {
10            eprintln!(
11                "[{}<{}>] LAUNCHED",
12                self.name
13                    .as_ref()
14                    .unwrap_or(&String::from("Model"))
15                    .to_uppercase(),
16                now.to_rfc3339_opts(SecondsFormat::Secs, true),
17            )
18        });
19        // let mut task_handles = vec![];
20        /*         let mut actors = self.actors.take().unwrap();
21        while let Some(mut actor) = actors.pop() {
22            task_handles.push(tokio::spawn(async move {
23                actor.task().await;
24            }));
25        } */
26        let task_handles: Vec<_> = self
27            .actors
28            .into_iter()
29            .flatten()
30            .map(|actor| {
31                #[cfg(tokio_unstable)]
32                {
33                    tokio::task::Builder::new()
34                        .name(actor.name())
35                        .spawn(async move { actor.task().await })
36                        .unwrap()
37                }
38                #[cfg(not(tokio_unstable))]
39                tokio::spawn(async move { actor.task().await })
40            })
41            .collect();
42        Model::<Running> {
43            name: self.name,
44            actors: None,
45            task_handles: Some(task_handles),
46            state: PhantomData,
47            start: Instant::now(),
48            verbose: self.verbose,
49            elapsed_time: Default::default(),
50        }
51    }
52}