use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct SearchSuggest {
pub tag: Option<Vec<SearchSuggestItem>>,
}
#[derive(Debug, Deserialize)]
pub struct SearchSuggestItem {
pub value: Option<String>,
pub name: Option<String>,
#[serde(rename = "type")]
pub item_type: Option<String>,
}
impl BpiClient {
pub async fn search_suggest(&self, term: &str) -> Result<BpiResponse<SearchSuggest>, BpiError> {
let params = [("term", term)];
self
.get("https://s.search.bilibili.com/main/suggest")
.query(¶ms)
.send_bpi("获取搜索建议").await
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::info;
#[tokio::test]
async fn test_search_suggest() {
let bpi = BpiClient::new();
let term = "rust";
let resp = bpi.search_suggest(term).await;
assert!(resp.is_ok());
if let Ok(r) = resp {
info!("搜索建议返回: {:?}", r);
if r.code == 0 {
if let Some(suggests) = r.data {
if let Some(tags) = suggests.tag {
assert!(!tags.is_empty());
info!("获取到搜索建议列表,数量:{}", tags.len());
if let Some(first_suggest) = tags.first() {
info!("第一个建议关键词: {:?}", first_suggest.value);
info!("第一个建议显示内容: {:?}", first_suggest.name);
}
} else {
info!("搜索建议列表为空。");
}
} else {
info!("返回数据中没有 'result' 字段。");
}
} else {
info!("API 返回码不为0,可能存在错误: {}", r.code);
}
}
}
}