use dbmcp_server::pagination::Cursor;
use schemars::JsonSchema;
use serde::Deserialize;
pub use dbmcp_server::types::{ListEntries, ListTablesResponse};
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DropTableRequest {
pub table: String,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListTablesRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListViewsRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListTriggersRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct QueryRequest {
pub query: String,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ReadQueryRequest {
pub query: String,
#[serde(default)]
pub cursor: Option<Cursor>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ExplainQueryRequest {
pub query: String,
}
#[cfg(test)]
mod tests {
use super::{ListTablesRequest, ListTriggersRequest};
#[test]
fn list_tables_request_defaults_to_brief_mode_without_search() {
let req: ListTablesRequest = serde_json::from_str("{}").expect("empty object should parse");
assert!(req.search.is_none());
assert!(!req.detailed, "detailed must default to false");
}
#[test]
fn list_tables_request_accepts_search_and_detailed() {
let req: ListTablesRequest = serde_json::from_str(r#"{"search": "post", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("post"));
assert!(req.detailed);
}
#[test]
fn list_triggers_request_defaults_to_brief_mode_without_search() {
let req: ListTriggersRequest = serde_json::from_str("{}").expect("empty object should parse");
assert!(req.search.is_none());
assert!(!req.detailed, "detailed must default to false");
}
#[test]
fn list_triggers_request_accepts_search_and_detailed() {
let req: ListTriggersRequest = serde_json::from_str(r#"{"search": "audit", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("audit"));
assert!(req.detailed);
}
}