use rmcp::schemars;
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyParams {
pub symbol: String,
pub start_date: String,
pub end_date: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct ForexHistEmParams {
pub symbol: String,
#[serde(default = "default_period")]
pub period: String,
#[serde(default)]
pub start_date: String,
#[serde(default)]
pub end_date: String,
#[serde(default)]
pub adjust: String,
}
fn default_period() -> String {
"daily".to_string()
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct ForexEmHistParams {
pub symbol: String,
#[serde(default = "default_forex_limit")]
pub limit: usize,
}
fn default_forex_limit() -> usize {
60
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyLatestParams {
pub base: String,
pub symbols: String,
#[serde(default)]
pub api_key: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyHistoryParams {
pub base: String,
pub date: String,
pub symbols: String,
#[serde(default)]
pub api_key: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyTimeSeriesParams {
pub base: String,
pub start_date: String,
pub end_date: String,
pub symbols: String,
#[serde(default)]
pub api_key: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyCurrenciesParams {
#[serde(default)]
pub c_type: String,
#[serde(default)]
pub api_key: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyConvertParams {
pub from: String,
pub to: String,
pub amount: f64,
#[serde(default)]
pub api_key: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct CurrencyPairParams {
pub pair: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_currency_params() {
let json = r#"{"symbol": "美元", "start_date": "20240101", "end_date": "20240601"}"#;
let params: CurrencyParams = serde_json::from_str(json).unwrap();
assert_eq!(params.symbol, "美元");
assert_eq!(params.start_date, "20240101");
assert_eq!(params.end_date, "20240601");
}
#[test]
fn test_forex_hist_em_params_defaults() {
let json = r#"{"symbol": "133.USDCNY"}"#;
let params: ForexHistEmParams = serde_json::from_str(json).unwrap();
assert_eq!(params.symbol, "133.USDCNY");
assert_eq!(params.period, "daily");
assert_eq!(params.start_date, "");
assert_eq!(params.end_date, "");
assert_eq!(params.adjust, "");
}
#[test]
fn test_forex_em_hist_params_defaults() {
let json = r#"{"symbol": "133.USDCNY"}"#;
let params: ForexEmHistParams = serde_json::from_str(json).unwrap();
assert_eq!(params.symbol, "133.USDCNY");
assert_eq!(params.limit, 60);
}
#[test]
fn test_currency_convert_params() {
let json = r#"{"from": "USD", "to": "CNY", "amount": 100.0, "api_key": "test"}"#;
let params: CurrencyConvertParams = serde_json::from_str(json).unwrap();
assert_eq!(params.from, "USD");
assert_eq!(params.to, "CNY");
assert!((params.amount - 100.0).abs() < f64::EPSILON);
assert_eq!(params.api_key, "test");
}
}