1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use uuid::Uuid;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(tag = "type", rename_all = "lowercase")]
7pub enum Message {
8 RegisterTriggerType {
9 id: String,
10 description: String,
11 },
12 RegisterTrigger {
13 id: String,
14 trigger_type: String,
15 function_id: String,
16 config: Value,
17 },
18 TriggerRegistrationResult {
19 id: String,
20 trigger_type: String,
21 function_id: String,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 error: Option<ErrorBody>,
24 },
25 UnregisterTrigger {
26 id: String,
27 trigger_type: String,
28 },
29 RegisterFunction {
30 id: String,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 description: Option<String>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 request_format: Option<Value>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 response_format: Option<Value>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 metadata: Option<Value>,
39 },
40 InvokeFunction {
41 invocation_id: Option<Uuid>,
42 function_id: String,
43 data: Value,
44 },
45 InvocationResult {
46 invocation_id: Uuid,
47 function_id: String,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 result: Option<Value>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 error: Option<ErrorBody>,
52 },
53 RegisterService {
54 id: String,
55 name: String,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 description: Option<String>,
58 },
59 Ping,
60 Pong,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct RegisterTriggerTypeMessage {
65 pub id: String,
66 pub description: String,
67}
68
69impl RegisterTriggerTypeMessage {
70 pub fn to_message(&self) -> Message {
71 Message::RegisterTriggerType {
72 id: self.id.clone(),
73 description: self.description.clone(),
74 }
75 }
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct RegisterTriggerMessage {
80 pub id: String,
81 pub trigger_type: String,
82 pub function_id: String,
83 pub config: Value,
84}
85
86impl RegisterTriggerMessage {
87 pub fn to_message(&self) -> Message {
88 Message::RegisterTrigger {
89 id: self.id.clone(),
90 trigger_type: self.trigger_type.clone(),
91 function_id: self.function_id.clone(),
92 config: self.config.clone(),
93 }
94 }
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct UnregisterTriggerMessage {
99 pub id: String,
100 pub trigger_type: String,
101}
102
103impl UnregisterTriggerMessage {
104 pub fn to_message(&self) -> Message {
105 Message::UnregisterTrigger {
106 id: self.id.clone(),
107 trigger_type: self.trigger_type.clone(),
108 }
109 }
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct RegisterFunctionMessage {
114 pub id: String,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub description: Option<String>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub request_format: Option<Value>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub response_format: Option<Value>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub metadata: Option<Value>,
123}
124
125impl RegisterFunctionMessage {
126 pub fn to_message(&self) -> Message {
127 Message::RegisterFunction {
128 id: self.id.clone(),
129 description: self.description.clone(),
130 request_format: self.request_format.clone(),
131 response_format: self.response_format.clone(),
132 metadata: self.metadata.clone(),
133 }
134 }
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
138pub struct RegisterServiceMessage {
139 pub id: String,
140 pub name: String,
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub description: Option<String>,
143}
144
145impl RegisterServiceMessage {
146 pub fn to_message(&self) -> Message {
147 Message::RegisterService {
148 id: self.id.clone(),
149 name: self.name.clone(),
150 description: self.description.clone(),
151 }
152 }
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct FunctionMessage {
157 pub function_id: String,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub description: Option<String>,
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub request_format: Option<Value>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub response_format: Option<Value>,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub metadata: Option<Value>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
169pub struct ErrorBody {
170 pub code: String,
171 pub message: String,
172}
173
174#[cfg(test)]
175mod tests {
176 use super::*;
177
178 #[test]
179 fn register_function_to_message_and_serializes_type() {
180 let msg = RegisterFunctionMessage {
181 id: "functions.echo".to_string(),
182 description: Some("Echo function".to_string()),
183 request_format: None,
184 response_format: None,
185 metadata: None,
186 };
187
188 let message = msg.to_message();
189 match &message {
190 Message::RegisterFunction {
191 id, description, ..
192 } => {
193 assert_eq!(id, "functions.echo");
194 assert_eq!(description.as_deref(), Some("Echo function"));
195 }
196 _ => panic!("unexpected message variant"),
197 }
198
199 let serialized = serde_json::to_value(&message).unwrap();
200 assert_eq!(serialized["type"], "registerfunction");
201 assert_eq!(serialized["id"], "functions.echo");
202 assert_eq!(serialized["description"], "Echo function");
203 }
204}