acts_next/scheduler/process/task/act/
cmd.rs1use 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}