agentlink-core 0.1.0

AgentLink SDK Core - Platform agnostic core library
Documentation
//! Message Protocol Types

use serde::{Deserialize, Serialize};
use serde_json::Value;

/// 消息
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    pub id: String,
    pub conversation_id: String,
    pub sender_id: String,
    pub content: Option<String>,
    pub message_type: String,
    pub status: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub reply_to_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data: Option<Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub execute_at: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub complete_at: Option<String>,
    pub created_at: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deleted_at: Option<String>,
}

/// 发送消息请求
/// Protocol: mrd/services/send-message-spec.md
#[derive(Debug, Clone, Serialize)]
pub struct SendMessageRequest {
    pub conversation_id: String,
    pub content: String,
    pub message_type: String,  // 不要使用 rename = "type",协议定义是 message_type
    #[serde(skip_serializing_if = "Option::is_none")]
    pub reply_to_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data: Option<Value>,
}

/// 消息列表响应
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessagesResponse {
    pub messages: Vec<Message>,
    pub total: i32,
}

/// 同步消息历史数据
/// 
/// Protocol: mqtt-events.md#sync_message_history
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyncMessageHistoryData {
    pub conversation_id: String,
    pub messages: Vec<Message>,
    pub has_more: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub next_page: Option<i32>,
    pub sync_id: i64,
}

/// 新消息数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NewMessageData {
    pub conversation_id: String,
    pub message: Message,
}

#[cfg(test)]
mod tests {
    use super::*;

    /// 测试 SendMessageRequest 序列化格式符合协议
    /// Protocol: mrd/services/send-message-spec.md
    #[test]
    fn test_send_message_request_serialization() {
        let request = SendMessageRequest {
            conversation_id: "660f9511-f3ac-52e5-b827-557766551111".to_string(),
            content: "你好,这是一条测试消息".to_string(),
            message_type: "text".to_string(),
            reply_to_id: None,
            data: None,
        };

        let json = serde_json::to_string(&request).unwrap();
        println!("Serialized JSON: {}", json);

        // 验证字段名是 message_type 而不是 type
        assert!(json.contains("\"message_type\":\"text\""), "字段名应该是 message_type,不是 type");
        assert!(!json.contains("\"type\":"), "不应该包含 type 字段");
        assert!(json.contains("\"conversation_id\":\"660f9511-f3ac-52e5-b827-557766551111\""));
        assert!(json.contains("\"content\":\"你好,这是一条测试消息\""));

        // 验证 JSON 结构符合协议
        let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
        assert_eq!(parsed["conversation_id"], "660f9511-f3ac-52e5-b827-557766551111");
        assert_eq!(parsed["content"], "你好,这是一条测试消息");
        assert_eq!(parsed["message_type"], "text");
    }
}