Skip to main content

agentlink_core/protocols/
message.rs

1//! Message Protocol Types
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6/// 消息
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Message {
9    pub id: String,
10    pub conversation_id: String,
11    pub sender_id: String,
12    pub content: Option<String>,
13    pub message_type: String,
14    pub status: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub reply_to_id: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub data: Option<Value>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub execute_at: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub complete_at: Option<String>,
23    pub created_at: String,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub deleted_at: Option<String>,
26}
27
28/// 发送消息请求
29/// Protocol: mrd/services/send-message-spec.md
30#[derive(Debug, Clone, Serialize)]
31pub struct SendMessageRequest {
32    pub conversation_id: String,
33    pub content: String,
34    pub message_type: String,  // 不要使用 rename = "type",协议定义是 message_type
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub reply_to_id: Option<String>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub data: Option<Value>,
39}
40
41/// 消息列表响应
42#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct MessagesResponse {
44    pub messages: Vec<Message>,
45    pub total: i32,
46}
47
48/// 同步消息历史数据
49/// 
50/// Protocol: mqtt-events.md#sync_message_history
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct SyncMessageHistoryData {
53    pub conversation_id: String,
54    pub messages: Vec<Message>,
55    pub has_more: bool,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub next_page: Option<i32>,
58    pub sync_id: i64,
59}
60
61/// 新消息数据
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct NewMessageData {
64    pub conversation_id: String,
65    pub message: Message,
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    /// 测试 SendMessageRequest 序列化格式符合协议
73    /// Protocol: mrd/services/send-message-spec.md
74    #[test]
75    fn test_send_message_request_serialization() {
76        let request = SendMessageRequest {
77            conversation_id: "660f9511-f3ac-52e5-b827-557766551111".to_string(),
78            content: "你好,这是一条测试消息".to_string(),
79            message_type: "text".to_string(),
80            reply_to_id: None,
81            data: None,
82        };
83
84        let json = serde_json::to_string(&request).unwrap();
85        println!("Serialized JSON: {}", json);
86
87        // 验证字段名是 message_type 而不是 type
88        assert!(json.contains("\"message_type\":\"text\""), "字段名应该是 message_type,不是 type");
89        assert!(!json.contains("\"type\":"), "不应该包含 type 字段");
90        assert!(json.contains("\"conversation_id\":\"660f9511-f3ac-52e5-b827-557766551111\""));
91        assert!(json.contains("\"content\":\"你好,这是一条测试消息\""));
92
93        // 验证 JSON 结构符合协议
94        let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
95        assert_eq!(parsed["conversation_id"], "660f9511-f3ac-52e5-b827-557766551111");
96        assert_eq!(parsed["content"], "你好,这是一条测试消息");
97        assert_eq!(parsed["message_type"], "text");
98    }
99}