1use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
2use serde::Deserialize;
3
4#[derive(Debug, Deserialize)]
6pub struct SearchSuggest {
7 pub tag: Option<Vec<SearchSuggestItem>>,
8}
9
10#[derive(Debug, Deserialize)]
12pub struct SearchSuggestItem {
13 pub value: Option<String>,
14 pub name: Option<String>,
15 #[serde(rename = "type")]
16 pub item_type: Option<String>,
17}
18
19impl BpiClient {
20 pub async fn search_suggest(&self, term: &str) -> Result<BpiResponse<SearchSuggest>, BpiError> {
28 let params = [("term", term)];
29
30 self
31 .get("https://s.search.bilibili.com/main/suggest")
32 .query(¶ms)
33 .send_bpi("获取搜索建议").await
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 use tracing::info;
41
42 #[tokio::test]
43 async fn test_search_suggest() {
44 let bpi = BpiClient::new();
46 let term = "rust";
48 let resp = bpi.search_suggest(term).await;
49
50 assert!(resp.is_ok());
52
53 if let Ok(r) = resp {
54 info!("搜索建议返回: {:?}", r);
55
56 if r.code == 0 {
58 if let Some(suggests) = r.data {
62 if let Some(tags) = suggests.tag {
64 assert!(!tags.is_empty());
65 info!("获取到搜索建议列表,数量:{}", tags.len());
66
67 if let Some(first_suggest) = tags.first() {
69 info!("第一个建议关键词: {:?}", first_suggest.value);
70 info!("第一个建议显示内容: {:?}", first_suggest.name);
71 }
72 } else {
73 info!("搜索建议列表为空。");
74 }
75 } else {
76 info!("返回数据中没有 'result' 字段。");
77 }
78 } else {
79 info!("API 返回码不为0,可能存在错误: {}", r.code);
80 }
81 }
82 }
83}