Skip to main content

acts_package_shell/
lib.rs

1mod package;
2
3use acts::{ActPackage, ActPlugin, ChannelOptions, Result};
4
5#[derive(Clone)]
6pub struct ShellPackagePlugin;
7
8#[async_trait::async_trait]
9impl ActPlugin for ShellPackagePlugin {
10    fn on_init(&self, engine: &acts::Engine) -> Result<()> {
11        let meta = package::ShellPackage::meta();
12        engine.extender().register_package(&meta)?;
13
14        let executor = engine.executor();
15        let chan = engine.channel_with_options(&ChannelOptions {
16            id: meta.id.to_string(),
17            ack: true,
18            r#type: "act".to_string(),
19            state: "created".to_string(),
20            uses: meta.id.to_string(),
21            ..Default::default()
22        });
23        chan.on_message(move |e| {
24            let inputs = e.inputs.clone();
25            let pid = e.pid.clone();
26            let tid = e.tid.clone();
27            let executor = executor.clone();
28            let pack = package::ShellPackage::create(&inputs);
29            if let Err(err) = pack {
30                executor.act().fail(&pid, &tid, err.into()).unwrap();
31                return;
32            }
33
34            let pack = pack.unwrap();
35            match pack.run() {
36                Ok(data) => {
37                    executor.act().complete(&pid, &tid, data).unwrap();
38                }
39                Err(err) => {
40                    executor.act().fail(&pid, &tid, err.into()).unwrap();
41                }
42            };
43        });
44
45        Ok(())
46    }
47}