Skip to main content

iii_sdk/
protocol.rs

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}