eva_robots/
seq_owned.rs

1use eva_common::prelude::*;
2use serde::{Deserialize, Serialize};
3use std::time::Duration;
4use uuid::Uuid;
5
6#[derive(Serialize, Deserialize)]
7pub struct SequenceOwned {
8    #[serde(alias = "uuid", deserialize_with = "crate::deserialize_uuid")]
9    pub u: Uuid,
10    pub seq: Vec<SequenceEntryOwned>,
11    pub on_abort: Option<SequenceActionEntryOwned>,
12    #[serde(
13        deserialize_with = "eva_common::tools::deserialize_duration_from_micros",
14        serialize_with = "eva_common::tools::serialize_duration_as_micros"
15    )]
16    pub timeout: Duration,
17}
18
19impl SequenceOwned {
20    #[inline]
21    pub fn new(timeout: Duration) -> Self {
22        Self {
23            u: Uuid::new_v4(),
24            seq: <_>::default(),
25            on_abort: <_>::default(),
26            timeout,
27        }
28    }
29    #[inline]
30    pub fn uuid(&self) -> Uuid {
31        self.u
32    }
33    #[inline]
34    pub fn timeout(&self) -> Duration {
35        self.timeout
36    }
37    #[inline]
38    #[allow(clippy::cast_possible_truncation)]
39    pub fn push_delay(&mut self, delay: Duration) {
40        self.seq
41            .push(SequenceEntryOwned::Delay(delay.as_micros() as u64));
42    }
43    #[inline]
44    pub fn push_action(&mut self, action: SequenceActionOwned) {
45        self.seq.push(SequenceEntryOwned::Actions(
46            SequenceActionEntryOwned::Single(action),
47        ));
48    }
49    #[inline]
50    pub fn push_actions_multi(&mut self, actions: Vec<SequenceActionOwned>) {
51        self.seq.push(SequenceEntryOwned::Actions(
52            SequenceActionEntryOwned::Multi(actions),
53        ));
54    }
55    pub fn max_expected_duration(&self) -> Duration {
56        let mut duration: Duration = Duration::from_secs(0);
57        for s in &self.seq {
58            match s {
59                SequenceEntryOwned::Delay(d) => duration += Duration::from_micros(*d),
60                SequenceEntryOwned::Actions(a) => match a {
61                    SequenceActionEntryOwned::Single(action) => duration += action.wait,
62                    SequenceActionEntryOwned::Multi(actions) => {
63                        duration += actions.iter().map(|a| a.wait).max().unwrap_or_default();
64                    }
65                },
66            }
67        }
68        duration
69    }
70    #[inline]
71    pub fn set_on_abort(&mut self, action: SequenceActionOwned) {
72        self.on_abort = Some(SequenceActionEntryOwned::Single(action));
73    }
74    #[inline]
75    pub fn set_on_abort_multi(&mut self, actions: Vec<SequenceActionOwned>) {
76        self.on_abort = Some(SequenceActionEntryOwned::Multi(actions));
77    }
78    pub fn abort_timeout(&self) -> Duration {
79        if let Some(ref on_abort) = self.on_abort {
80            match on_abort {
81                SequenceActionEntryOwned::Single(a) => a.wait,
82                SequenceActionEntryOwned::Multi(actions) => {
83                    actions.iter().map(|a| a.wait).max().unwrap_or_default()
84                }
85            }
86        } else {
87            Duration::from_secs(0)
88        }
89    }
90}
91
92#[derive(Serialize, Deserialize)]
93#[serde(untagged)]
94pub enum SequenceEntryOwned {
95    Delay(u64),
96    Actions(SequenceActionEntryOwned),
97}
98
99#[derive(Serialize, Deserialize)]
100#[serde(untagged)]
101pub enum SequenceActionEntryOwned {
102    Single(SequenceActionOwned),
103    Multi(Vec<SequenceActionOwned>),
104}
105
106#[derive(Serialize, Deserialize)]
107pub struct SequenceActionOwned {
108    #[serde(rename = "i")]
109    pub oid: OID,
110    pub params: Option<eva_common::actions::Params>,
111    #[serde(
112        deserialize_with = "eva_common::tools::deserialize_duration_from_micros",
113        serialize_with = "eva_common::tools::serialize_duration_as_micros"
114    )]
115    pub wait: Duration,
116}
117
118impl SequenceActionOwned {
119    pub fn new_unit(oid: OID, value: Value, wait: Duration) -> Self {
120        Self {
121            oid,
122            params: Some(eva_common::actions::Params::Unit(
123                eva_common::actions::UnitParams { value },
124            )),
125            wait,
126        }
127    }
128}