acts_package_shell/
lib.rs1mod 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}