use rmcp::schemars;
#[derive(Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct ExtractFileParams {
pub path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<serde_json::Value>,
}
#[derive(Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct ExtractBytesParams {
pub data: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<serde_json::Value>,
}
#[derive(Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct BatchExtractFilesParams {
pub paths: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<serde_json::Value>,
}
#[derive(Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct DetectMimeTypeParams {
pub path: String,
#[serde(default = "default_use_content")]
pub use_content: bool,
}
fn default_use_content() -> bool {
true
}
#[derive(Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
pub struct EmptyParams {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_file_params_defaults() {
let json = r#"{"path": "/test.pdf"}"#;
let params: ExtractFileParams = serde_json::from_str(json).unwrap();
assert_eq!(params.path, "/test.pdf");
assert_eq!(params.mime_type, None);
assert_eq!(params.config, None);
}
#[test]
fn test_extract_bytes_params_defaults() {
let json = r#"{"data": "SGVsbG8="}"#;
let params: ExtractBytesParams = serde_json::from_str(json).unwrap();
assert_eq!(params.data, "SGVsbG8=");
assert_eq!(params.mime_type, None);
assert_eq!(params.config, None);
}
#[test]
fn test_batch_extract_files_params_defaults() {
let json = r#"{"paths": ["/a.pdf", "/b.pdf"]}"#;
let params: BatchExtractFilesParams = serde_json::from_str(json).unwrap();
assert_eq!(params.paths.len(), 2);
assert_eq!(params.config, None);
}
#[test]
fn test_detect_mime_type_params_defaults() {
let json = r#"{"path": "/test.pdf"}"#;
let params: DetectMimeTypeParams = serde_json::from_str(json).unwrap();
assert_eq!(params.path, "/test.pdf");
assert!(params.use_content);
}
#[test]
fn test_detect_mime_type_params_use_content_false() {
let json = r#"{"path": "/test.pdf", "use_content": false}"#;
let params: DetectMimeTypeParams = serde_json::from_str(json).unwrap();
assert!(!params.use_content);
}
#[test]
fn test_extract_file_params_with_config() {
let json = r#"{"path": "/test.pdf", "config": {"use_cache": false}}"#;
let params: ExtractFileParams = serde_json::from_str(json).unwrap();
assert_eq!(params.path, "/test.pdf");
assert!(params.config.is_some());
}
#[test]
fn test_extract_file_params_serialization() {
let params = ExtractFileParams {
path: "/test.pdf".to_string(),
mime_type: Some("application/pdf".to_string()),
config: Some(serde_json::json!({"use_cache": false})),
};
let json = serde_json::to_string(¶ms).unwrap();
let deserialized: ExtractFileParams = serde_json::from_str(&json).unwrap();
assert_eq!(params.path, deserialized.path);
assert_eq!(params.mime_type, deserialized.mime_type);
assert_eq!(params.config, deserialized.config);
}
#[test]
fn test_extract_bytes_params_serialization() {
let params = ExtractBytesParams {
data: "SGVsbG8=".to_string(),
mime_type: None,
config: None,
};
let json = serde_json::to_string(¶ms).unwrap();
let deserialized: ExtractBytesParams = serde_json::from_str(&json).unwrap();
assert_eq!(params.data, deserialized.data);
}
#[test]
fn test_batch_extract_params_serialization() {
let params = BatchExtractFilesParams {
paths: vec!["/a.pdf".to_string(), "/b.pdf".to_string()],
config: Some(serde_json::json!({"use_cache": true})),
};
let json = serde_json::to_string(¶ms).unwrap();
let deserialized: BatchExtractFilesParams = serde_json::from_str(&json).unwrap();
assert_eq!(params.paths, deserialized.paths);
assert_eq!(params.config, deserialized.config);
}
#[test]
fn test_detect_mime_type_params_serialization() {
let params = DetectMimeTypeParams {
path: "/test.pdf".to_string(),
use_content: false,
};
let json = serde_json::to_string(¶ms).unwrap();
let deserialized: DetectMimeTypeParams = serde_json::from_str(&json).unwrap();
assert_eq!(params.path, deserialized.path);
assert_eq!(params.use_content, deserialized.use_content);
}
#[test]
fn test_empty_params_schema_has_type_object() {
let schema = schemars::schema_for!(EmptyParams);
let json = serde_json::to_value(&schema).unwrap();
assert_eq!(json["type"], "object");
}
#[test]
fn test_empty_params_deserializes_from_empty_object() {
let params: EmptyParams = serde_json::from_str("{}").unwrap();
let _ = params;
}
}