use rmcp::schemars;
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundHkHistParams {
pub code: String,
#[serde(default = "default_query_type")]
pub query_type: String,
}
fn default_query_type() -> String {
"历史净值明细".to_string()
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundHistParams {
pub symbol: String,
#[serde(default = "default_limit")]
pub limit: usize,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundRankParams {
pub symbol: String,
#[serde(default = "default_limit")]
pub limit: usize,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundInfoIndexParams {
#[serde(default = "default_info_index_symbol")]
pub symbol: String,
#[serde(default = "default_info_index_indicator")]
pub indicator: String,
#[serde(default = "default_limit")]
pub limit: usize,
}
fn default_info_index_symbol() -> String {
"全部".to_string()
}
fn default_info_index_indicator() -> String {
"全部".to_string()
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundEtfHistFullParams {
pub symbol: String,
#[serde(default = "default_period")]
pub period: String,
#[serde(default)]
pub start_date: String,
#[serde(default)]
pub end_date: String,
#[serde(default = "default_adjust")]
pub adjust: String,
}
fn default_period() -> String {
"daily".to_string()
}
fn default_adjust() -> String {
"qfq".to_string()
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundOpenFundInfoParams {
pub symbol: String,
#[serde(default)]
pub start_date: String,
#[serde(default)]
pub end_date: String,
#[serde(default = "default_open_indicator")]
pub indicator: String,
}
fn default_open_indicator() -> String {
"单位净值走势".to_string()
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundQdiiCookieParams {
#[serde(default)]
pub cookie: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FundEtfCategoryThsParams {
#[serde(default = "default_etf_category")]
pub symbol: String,
#[serde(default)]
pub date: String,
}
fn default_etf_category() -> String {
"ETF".to_string()
}
const fn default_limit() -> usize {
60
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fund_info_index_params_default() {
let json = r#"{}"#;
let params: FundInfoIndexParams = serde_json::from_str(json).unwrap();
assert_eq!(params.symbol, "全部");
assert_eq!(params.indicator, "全部");
assert_eq!(params.limit, 60);
}
#[test]
fn test_fund_etf_hist_full_params() {
let json = r#"{"symbol": "510300"}"#;
let params: FundEtfHistFullParams = serde_json::from_str(json).unwrap();
assert_eq!(params.symbol, "510300");
assert_eq!(params.period, "daily");
assert_eq!(params.adjust, "qfq");
}
#[test]
fn test_fund_open_fund_info_params() {
let json = r#"{"symbol": "710001"}"#;
let params: FundOpenFundInfoParams = serde_json::from_str(json).unwrap();
assert_eq!(params.symbol, "710001");
assert_eq!(params.indicator, "单位净值走势");
}
#[test]
fn test_fund_qdii_cookie_params_default() {
let json = r#"{}"#;
let params: FundQdiiCookieParams = serde_json::from_str(json).unwrap();
assert_eq!(params.cookie, "");
}
}