zai_rs/tool/web_search/
response.rs

1use serde::{Deserialize, Serialize};
2use validator::Validate;
3
4/// Web search item returned by the service.
5/// Notes:
6/// - `link` and media URLs may be temporary; consider downloading or caching if needed.
7/// - Fields are optional and may vary by search provider/source.
8#[derive(Debug, Clone, Serialize, Deserialize, Validate)]
9pub struct WebSearchInfo {
10    /// Source website icon
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub icon: Option<String>,
13    /// Search result title
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub title: Option<String>,
16    /// Search result page link
17    #[serde(skip_serializing_if = "Option::is_none")]
18    #[validate(url)]
19    pub link: Option<String>,
20    /// Media source name of the page
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub media: Option<String>,
23    /// Publish date on the website
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub publish_date: Option<String>,
26    /// Quoted text content from the search result page
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub content: Option<String>,
29    /// Corner mark sequence number
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub refer: Option<String>,
32}
33
34/// Web search API response
35#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct WebSearchResponse {
37    /// Task ID
38    pub id: String,
39    /// Request creation time as Unix timestamp
40    pub created: i64,
41    /// Request identifier
42    pub request_id: String,
43    /// Search intent results
44    pub search_intent: Vec<SearchIntent>,
45    /// Search results
46    pub search_result: Vec<SearchResult>,
47}
48
49/// Search intent result
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct SearchIntent {
52    /// The search query
53    pub query: String,
54    /// The detected intent type
55    pub intent: String,
56    /// Extracted keywords
57    pub keywords: String,
58}
59
60/// Individual search result item
61#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct SearchResult {
63    /// Title of the search result
64    pub title: String,
65    /// Content summary
66    pub content: String,
67    /// URL link to the result
68    pub link: String,
69    /// Website/media name
70    pub media: String,
71    /// Website icon URL
72    pub icon: String,
73    /// Reference index number
74    pub refer: String,
75    /// Publication date
76    pub publish_date: String,
77}
78
79impl WebSearchResponse {
80    /// Get the total number of search results
81    pub fn result_count(&self) -> usize {
82        self.search_result.len()
83    }
84
85    /// Get the search intent results
86    pub fn intents(&self) -> &Vec<SearchIntent> {
87        &self.search_intent
88    }
89
90    /// Get the search results
91    pub fn results(&self) -> &Vec<SearchResult> {
92        &self.search_result
93    }
94
95    /// Get the task ID
96    pub fn task_id(&self) -> &str {
97        &self.id
98    }
99
100    /// Get the request creation time as Unix timestamp
101    pub fn created_at(&self) -> i64 {
102        self.created
103    }
104
105    /// Get the request ID
106    pub fn request_id(&self) -> &str {
107        &self.request_id
108    }
109}