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}