1mod package;
2
3use acts::{ActPackage, ActPlugin, ChannelOptions, Result};
4
5#[derive(Clone)]
6pub struct HttpPackagePlugin;
7
8#[async_trait::async_trait]
9impl ActPlugin for HttpPackagePlugin {
10 async fn on_init(&self, engine: &acts::Engine) -> Result<()> {
11 let meta = package::HttpPackage::meta();
12 engine.extender().register_package(&meta)?;
13
14 let executor = engine.executor();
15 let chan = engine.channel_with_options(&ChannelOptions {
16 id: meta.name.to_string(),
17 ack: true,
18 r#type: "act".to_string(),
19 state: "created".to_string(),
20 uses: meta.name.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 tokio::spawn(async move {
29 let pack = package::HttpPackage::create(&inputs);
30 if let Err(err) = pack {
31 executor.act().error(&pid, &tid, &err.into()).unwrap();
32 return;
33 }
34
35 let pack = pack.unwrap();
36 match pack.run().await {
37 Ok(data) => {
38 executor.act().complete(&pid, &tid, &data).unwrap();
39 }
40 Err(err) => {
41 executor.act().error(&pid, &tid, &err.into()).unwrap();
42 }
43 };
44 });
45 });
46
47 Ok(())
48 }
49}