use rmcp::schemars;
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct NewsDateParams {
pub date: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct NewsSearchParams {
pub query: String,
#[serde(default = "default_limit")]
pub limit: usize,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct NewsSymbolParams {
pub symbol: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct StockNewsSearchParams {
pub symbol: String,
#[serde(default = "default_limit")]
pub limit: usize,
}
const fn default_limit() -> usize {
20
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct NewsSearchWithScopeParams {
pub query: String,
#[serde(default = "default_limit")]
pub limit: usize,
#[serde(default = "default_scope")]
pub scope: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct NewsQueryTimeoutParams {
pub query: String,
#[serde(default = "default_timeout")]
pub timeout_secs: u64,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct GdeltNewsSearchParams {
pub query: String,
#[serde(default = "default_gdelt_base_url")]
pub base_url: String,
#[serde(default)]
pub language_hint: Option<String>,
#[serde(default = "default_time_range")]
pub time_range: Option<String>,
#[serde(default = "default_timeout")]
pub timeout_secs: u64,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct BingNewsRssParams {
pub query: String,
#[serde(default = "default_timeout")]
pub timeout_secs: u64,
#[serde(default)]
pub lang: Option<String>,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct FinnhubNewsParams {
pub symbol: String,
pub from: String,
pub to: String,
#[serde(default)]
pub api_key: String,
}
#[derive(serde::Deserialize, schemars::JsonSchema)]
pub struct MarketauxNewsParams {
pub symbol: String,
#[serde(default)]
pub api_key: String,
#[serde(default = "default_marketaux_limit")]
pub limit: usize,
}
fn default_marketaux_limit() -> usize {
3
}
fn default_scope() -> String {
"default".to_string()
}
const fn default_timeout() -> u64 {
30
}
fn default_gdelt_base_url() -> String {
"https://api.gdeltproject.org/api/v2/doc/doc".to_string()
}
fn default_time_range() -> Option<String> {
Some("month".to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_news_search_with_scope_params_defaults() {
let json = r#"{"query": "stock"}"#;
let params: NewsSearchWithScopeParams = serde_json::from_str(json).unwrap();
assert_eq!(params.query, "stock");
assert_eq!(params.limit, 20);
assert_eq!(params.scope, "default");
}
#[test]
fn test_news_search_with_scope_params_custom() {
let json = r#"{"query": "bond", "limit": 50, "scope": "global"}"#;
let params: NewsSearchWithScopeParams = serde_json::from_str(json).unwrap();
assert_eq!(params.limit, 50);
assert_eq!(params.scope, "global");
}
#[test]
fn test_news_query_timeout_params_defaults() {
let json = r#"{"query": "finance"}"#;
let params: NewsQueryTimeoutParams = serde_json::from_str(json).unwrap();
assert_eq!(params.query, "finance");
assert_eq!(params.timeout_secs, 30);
}
#[test]
fn test_gdelt_news_search_params_defaults() {
let json = r#"{"query": "economy"}"#;
let params: GdeltNewsSearchParams = serde_json::from_str(json).unwrap();
assert_eq!(params.query, "economy");
assert_eq!(
params.base_url,
"https://api.gdeltproject.org/api/v2/doc/doc"
);
assert_eq!(params.language_hint, None);
assert_eq!(params.time_range, Some("month".to_string()));
assert_eq!(params.timeout_secs, 30);
}
#[test]
fn test_bing_news_rss_params_defaults() {
let json = r#"{"query": "market"}"#;
let params: BingNewsRssParams = serde_json::from_str(json).unwrap();
assert_eq!(params.query, "market");
assert_eq!(params.timeout_secs, 30);
assert_eq!(params.lang, None);
}
}