use rmcp::schemars;
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ScrapeParams {
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub use_browser: Option<bool>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct CrawlParams {
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_pages: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stay_on_domain: Option<bool>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct MapParams {
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub search: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub respect_robots_txt: Option<bool>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct BatchScrapeParams {
pub urls: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub concurrency: Option<usize>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ScreenshotParams {
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub full_page: Option<bool>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct DownloadParams {
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_size: Option<usize>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct InteractParams {
pub url: String,
pub actions: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ResearchParams {
pub query: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_pages: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub seed_urls: Option<Vec<String>>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct CrawlStatusParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub job_id: Option<String>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct EmptyParams {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_scrape_params_defaults() {
let json = r#"{"url": "https://example.com"}"#;
let params: ScrapeParams = serde_json::from_str(json).unwrap();
assert_eq!(params.url, "https://example.com");
assert_eq!(params.format, None);
assert_eq!(params.use_browser, None);
}
#[test]
fn test_crawl_params_defaults() {
let json = r#"{"url": "https://example.com"}"#;
let params: CrawlParams = serde_json::from_str(json).unwrap();
assert_eq!(params.url, "https://example.com");
assert_eq!(params.max_depth, None);
assert_eq!(params.max_pages, None);
assert_eq!(params.format, None);
assert_eq!(params.stay_on_domain, None);
}
#[test]
fn test_map_params_defaults() {
let json = r#"{"url": "https://example.com"}"#;
let params: MapParams = serde_json::from_str(json).unwrap();
assert_eq!(params.url, "https://example.com");
assert_eq!(params.limit, None);
assert_eq!(params.search, None);
assert_eq!(params.respect_robots_txt, None);
}
#[test]
fn test_batch_scrape_params_defaults() {
let json = r#"{"urls": ["https://a.com", "https://b.com"]}"#;
let params: BatchScrapeParams = serde_json::from_str(json).unwrap();
assert_eq!(params.urls.len(), 2);
assert_eq!(params.format, None);
assert_eq!(params.concurrency, None);
}
#[test]
fn test_interact_params() {
let json = r##"{"url": "https://example.com", "actions": [{"type": "click", "selector": "#btn"}]}"##;
let params: InteractParams = serde_json::from_str(json).unwrap();
assert_eq!(params.url, "https://example.com");
assert_eq!(params.actions.len(), 1);
}
#[test]
fn test_research_params_defaults() {
let json = r#"{"query": "rust async patterns"}"#;
let params: ResearchParams = serde_json::from_str(json).unwrap();
assert_eq!(params.query, "rust async patterns");
assert_eq!(params.max_depth, None);
assert_eq!(params.seed_urls, None);
}
}