acts_package_http/
lib.rs

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}