malbox_plugin_sdk/plugin/
host.rs1use crate::context::Context;
9use crate::error::Result;
10use malbox_plugin_transport::messages::events::Event;
11use std::collections::HashMap;
12
13use super::Plugin;
14
15pub trait HostPlugin: Plugin {
21 fn on_task(&self, ctx: &Context) -> Result<()> {
26 let _ = ctx;
27 Ok(())
28 }
29
30 fn on_start(&self, config: HashMap<String, String>) -> Result<()> {
33 let _ = config;
34 Ok(())
35 }
36
37 fn on_stop(&self) -> Result<()> {
40 Ok(())
41 }
42
43 fn on_event(&self, event: Event) -> Result<()> {
50 let _ = event;
51 Ok(())
52 }
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58 use crate::result::PluginResult;
59 use std::collections::HashMap;
60 use std::sync::Arc;
61
62 struct MinimalPlugin;
63 impl Plugin for MinimalPlugin {}
64 impl HostPlugin for MinimalPlugin {}
65
66 #[test]
67 fn minimal_plugin_defaults_work() {
68 let plugin = MinimalPlugin;
69
70 assert!(plugin.on_start(HashMap::new()).is_ok());
71 assert!(plugin.on_stop().is_ok());
72
73 let health = plugin.health_check();
74 assert!(health.is_ready());
75 }
76
77 struct TaskOnlyPlugin;
78 impl Plugin for TaskOnlyPlugin {}
79 impl HostPlugin for TaskOnlyPlugin {
80 fn on_task(&self, ctx: &Context) -> Result<()> {
81 ctx.results()
82 .push(PluginResult::bytes("hello", vec![1, 2, 3]))?;
83 Ok(())
84 }
85 }
86
87 fn noop_emitter() -> Arc<dyn malbox_plugin_transport::traits::TransportEmitter + Send + Sync> {
88 Arc::new(())
89 }
90
91 #[test]
92 fn task_only_plugin_override_works() {
93 let plugin = TaskOnlyPlugin;
94 let (tx, mut rx) = tokio::sync::mpsc::channel(4);
95 let ctx = Context::new(
96 1,
97 std::path::PathBuf::new(),
98 HashMap::new(),
99 noop_emitter(),
100 Some(tx),
101 #[cfg(feature = "guest")]
102 None,
103 );
104
105 plugin.on_task(&ctx).expect("on_task should succeed");
106
107 let msg = rx.try_recv().expect("one result expected");
108 assert_eq!(msg.result_name, "hello");
109 assert_eq!(msg.data, vec![1, 2, 3]);
110 }
111
112 #[test]
113 fn on_event_default_is_noop() {
114 let plugin = MinimalPlugin;
115 let event = Event::TaskCreated { task_id: 42 };
116
117 let result = plugin.on_event(event);
118 assert!(result.is_ok());
119 }
120}