1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5use crate::protocol::TriggerAction;
6
7#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
13pub struct MiddlewareFunctionInput {
14 pub function_id: String,
16 pub payload: Value,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub action: Option<TriggerAction>,
21 pub context: Value,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub namespace: Option<String>,
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32 use serde_json::json;
33
34 #[test]
35 fn deserializes_namespace_from_engine_middleware_input() {
36 let input: MiddlewareFunctionInput = serde_json::from_value(json!({
38 "function_id": "orders::create",
39 "payload": {},
40 "context": {},
41 "namespace": "orders",
42 }))
43 .unwrap();
44 assert_eq!(input.namespace, Some("orders".to_string()));
45 }
46
47 #[test]
48 fn namespace_is_optional() {
49 let input: MiddlewareFunctionInput = serde_json::from_value(json!({
50 "function_id": "orders::create",
51 "payload": {},
52 "context": {},
53 }))
54 .unwrap();
55 assert_eq!(input.namespace, None);
56 }
57}