acts_next/scheduler/process/task/act/
cmd.rs

1use crate::event::EventAction;
2use crate::{
3    utils::{self, consts},
4    ActError, ActTask, Context, Do, Error, Result, TaskState,
5};
6
7impl Do {
8    pub fn run(&self, ctx: &Context) -> Result<()> {
9        let task = ctx.task();
10        if self.key.is_empty() {
11            return Err(crate::ActError::Action(format!(
12                "cannot find 'key' in act '{}'",
13                task.node.id
14            )));
15        }
16        let set_inputs = || {
17            if !self.inputs.is_empty() {
18                let inputs = utils::fill_inputs(&self.inputs, ctx);
19                task.update_data(&inputs);
20            }
21        };
22
23        let key = EventAction::parse(&self.key)?;
24        match key {
25            EventAction::Submit => {
26                set_inputs();
27                task.set_state(TaskState::Submitted);
28                task.next(ctx)?;
29            }
30            EventAction::Next => {
31                set_inputs();
32                task.set_state(TaskState::Completed);
33                task.next(ctx)?;
34            }
35            EventAction::Skip => {
36                set_inputs();
37                task.set_state(TaskState::Skipped);
38                task.next(ctx)?;
39            }
40            EventAction::Abort => {
41                set_inputs();
42                ctx.abort_task(&task)?;
43            }
44            EventAction::SetProcessVars => {
45                set_inputs();
46            }
47            EventAction::Error => {
48                let ecode =
49                    self.inputs
50                        .get::<String>(consts::ACT_ERR_CODE)
51                        .ok_or(ActError::Action(format!(
52                            "cannot find '{}' in cmd.inputs",
53                            consts::ACT_ERR_CODE
54                        )))?;
55                let error = self
56                    .inputs
57                    .get::<String>(consts::ACT_ERR_MESSAGE)
58                    .unwrap_or("".to_string());
59                let err = Error::new(&error, &ecode);
60                set_inputs();
61                task.set_err(&err);
62                task.error(ctx)?;
63            }
64            _ => {
65                return Err(ActError::Runtime(format!(
66                    "the cmd.name({key}) does not exists"
67                )));
68            }
69        }
70        Ok(())
71    }
72}