Skip to main content

smcp_computer/desktop/
model.rs

1/**
2* 文件名: model.rs
3* 作者: JQQ
4* 创建日期: 2025/12/16
5* 最后修改日期: 2025/12/16
6* 版权: 2023 JQQ. All rights reserved.
7* 依赖: serde, async-trait
8* 描述: Desktop相关的数据模型定义 / Desktop-related data model definitions
9*/
10use serde::{Deserialize, Serialize};
11use std::collections::HashMap;
12
13// 重新导出mcp_clients中的类型 / Re-export types from mcp_clients
14pub use crate::mcp_clients::model::{ReadResourceResult, Resource, TextResourceContents};
15
16/// 服务器名称类型 / Server name type
17pub type ServerName = String;
18
19/// 工具调用记录 / Tool call record
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21pub struct ToolCallRecord {
22    /// 服务器名称 / Server name
23    pub server: ServerName,
24    /// 工具名称 / Tool name
25    pub tool: String,
26    /// 调用时间戳 / Call timestamp
27    pub timestamp: i64,
28    /// 额外元数据 / Additional metadata
29    #[serde(skip_serializing_if = "HashMap::is_empty")]
30    pub metadata: HashMap<String, serde_json::Value>,
31}
32
33/// 窗口信息 / Window information
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
35pub struct WindowInfo {
36    /// 服务器名称 / Server name
37    pub server_name: ServerName,
38    /// 资源 / Resource
39    pub resource: Resource,
40    /// 读取结果 / Read result
41    pub read_result: ReadResourceResult,
42}
43
44impl WindowInfo {
45    /// 创建新的窗口信息 / Create new window info
46    pub fn new(
47        server_name: ServerName,
48        resource: Resource,
49        read_result: ReadResourceResult,
50    ) -> Self {
51        Self {
52            server_name,
53            resource,
54            read_result,
55        }
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_window_info() {
65        let resource = Resource {
66            uri: "window://test.mcp.com/window1".to_string(),
67            name: "Test Window".to_string(),
68            description: Some("Test window".to_string()),
69            mime_type: None,
70        };
71
72        let read_result = ReadResourceResult {
73            contents: vec![TextResourceContents {
74                uri: "window://test.mcp.com/window1".to_string(),
75                text: "Test content".to_string(),
76                mime_type: None,
77            }],
78        };
79
80        let window_info = WindowInfo::new("test_server".to_string(), resource, read_result);
81
82        assert_eq!(window_info.server_name, "test_server");
83        assert_eq!(window_info.resource.name, "Test Window");
84        assert_eq!(window_info.read_result.contents.len(), 1);
85    }
86
87    #[test]
88    fn test_tool_call_record() {
89        let record = ToolCallRecord {
90            server: "test_server".to_string(),
91            tool: "test_tool".to_string(),
92            timestamp: 1234567890,
93            metadata: HashMap::new(),
94        };
95
96        assert_eq!(record.server, "test_server");
97        assert_eq!(record.tool, "test_tool");
98        assert_eq!(record.timestamp, 1234567890);
99    }
100}