use dbmcp_server::pagination::Cursor;
use schemars::JsonSchema;
use serde::Deserialize;
pub use dbmcp_server::types::{
ListEntries, ListFunctionsResponse, ListProceduresResponse, ListTablesResponse, ListViewsResponse,
};
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DropTableRequest {
#[serde(default)]
pub database: Option<String>,
pub table: String,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListTablesRequest {
#[serde(default)]
pub database: Option<String>,
#[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 ListFunctionsRequest {
#[serde(default)]
pub database: Option<String>,
#[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 ListProceduresRequest {
#[serde(default)]
pub database: Option<String>,
#[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 database: Option<String>,
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[cfg(test)]
mod tests {
use super::{ListFunctionsRequest, ListProceduresRequest, ListTablesRequest, ListViewsRequest};
#[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": "order", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("order"));
assert!(req.detailed);
}
#[test]
fn list_functions_request_defaults_to_brief_mode_without_search() {
let req: ListFunctionsRequest = 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_functions_request_accepts_search_and_detailed() {
let req: ListFunctionsRequest =
serde_json::from_str(r#"{"search": "order", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("order"));
assert!(req.detailed);
}
#[test]
fn list_procedures_request_defaults_to_brief_mode_without_search() {
let req: ListProceduresRequest = 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_procedures_request_accepts_search_and_detailed() {
let req: ListProceduresRequest =
serde_json::from_str(r#"{"search": "archive", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("archive"));
assert!(req.detailed);
}
#[test]
fn list_views_request_defaults_to_brief_mode_without_search() {
let req: ListViewsRequest = 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_views_request_accepts_search_and_detailed() {
let req: ListViewsRequest = serde_json::from_str(r#"{"search": "active", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("active"));
assert!(req.detailed);
}
}