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)]
#[schemars(rename = "DropTableRequest")]
pub struct PinnedDropTableRequest {
pub table: String,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "DropTableRequest")]
pub struct UnpinnedDropTableRequest {
#[serde(flatten)]
pub inner: PinnedDropTableRequest,
#[serde(default)]
pub database: Option<String>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListTablesRequest")]
pub struct PinnedListTablesRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListTablesRequest")]
pub struct UnpinnedListTablesRequest {
#[serde(flatten)]
pub inner: PinnedListTablesRequest,
#[serde(default)]
pub database: Option<String>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListFunctionsRequest")]
pub struct PinnedListFunctionsRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListFunctionsRequest")]
pub struct UnpinnedListFunctionsRequest {
#[serde(flatten)]
pub inner: PinnedListFunctionsRequest,
#[serde(default)]
pub database: Option<String>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListProceduresRequest")]
pub struct PinnedListProceduresRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListProceduresRequest")]
pub struct UnpinnedListProceduresRequest {
#[serde(flatten)]
pub inner: PinnedListProceduresRequest,
#[serde(default)]
pub database: Option<String>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListViewsRequest")]
pub struct PinnedListViewsRequest {
#[serde(default)]
pub cursor: Option<Cursor>,
#[serde(default)]
pub search: Option<String>,
#[serde(default)]
pub detailed: bool,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
#[schemars(rename = "ListViewsRequest")]
pub struct UnpinnedListViewsRequest {
#[serde(flatten)]
pub inner: PinnedListViewsRequest,
#[serde(default)]
pub database: Option<String>,
}
#[cfg(test)]
mod tests {
use super::{
PinnedListFunctionsRequest, PinnedListProceduresRequest, PinnedListTablesRequest, PinnedListViewsRequest,
UnpinnedListFunctionsRequest, UnpinnedListProceduresRequest, UnpinnedListTablesRequest,
UnpinnedListViewsRequest,
};
#[test]
fn unpinned_list_tables_request_defaults_to_brief_mode_without_search() {
let req: PinnedListTablesRequest = serde_json::from_str("{}").expect("empty object should parse");
assert!(req.search.is_none());
assert!(!req.detailed, "detailed must default to false");
}
#[test]
fn unpinned_list_tables_request_accepts_search_and_detailed() {
let req: PinnedListTablesRequest =
serde_json::from_str(r#"{"search": "order", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("order"));
assert!(req.detailed);
}
#[test]
fn pinned_list_tables_request_accepts_database() {
let req: UnpinnedListTablesRequest = serde_json::from_str(r#"{"database": "mydb"}"#).expect("parse");
assert_eq!(req.database.as_deref(), Some("mydb"));
}
#[test]
fn unpinned_list_functions_request_defaults_to_brief_mode_without_search() {
let req: PinnedListFunctionsRequest = serde_json::from_str("{}").expect("empty object should parse");
assert!(req.search.is_none());
assert!(!req.detailed, "detailed must default to false");
}
#[test]
fn unpinned_list_functions_request_accepts_search_and_detailed() {
let req: PinnedListFunctionsRequest =
serde_json::from_str(r#"{"search": "order", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("order"));
assert!(req.detailed);
}
#[test]
fn pinned_list_functions_request_accepts_database() {
let req: UnpinnedListFunctionsRequest = serde_json::from_str(r#"{"database": "mydb"}"#).expect("parse");
assert_eq!(req.database.as_deref(), Some("mydb"));
}
#[test]
fn unpinned_list_procedures_request_defaults_to_brief_mode_without_search() {
let req: PinnedListProceduresRequest = serde_json::from_str("{}").expect("empty object should parse");
assert!(req.search.is_none());
assert!(!req.detailed, "detailed must default to false");
}
#[test]
fn unpinned_list_procedures_request_accepts_search_and_detailed() {
let req: PinnedListProceduresRequest =
serde_json::from_str(r#"{"search": "archive", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("archive"));
assert!(req.detailed);
}
#[test]
fn pinned_list_procedures_request_accepts_database() {
let req: UnpinnedListProceduresRequest = serde_json::from_str(r#"{"database": "mydb"}"#).expect("parse");
assert_eq!(req.database.as_deref(), Some("mydb"));
}
#[test]
fn unpinned_list_views_request_defaults_to_brief_mode_without_search() {
let req: PinnedListViewsRequest = serde_json::from_str("{}").expect("empty object should parse");
assert!(req.search.is_none());
assert!(!req.detailed, "detailed must default to false");
}
#[test]
fn unpinned_list_views_request_accepts_search_and_detailed() {
let req: PinnedListViewsRequest =
serde_json::from_str(r#"{"search": "active", "detailed": true}"#).expect("parse");
assert_eq!(req.search.as_deref(), Some("active"));
assert!(req.detailed);
}
#[test]
fn pinned_list_views_request_accepts_database() {
let req: UnpinnedListViewsRequest = serde_json::from_str(r#"{"database": "mydb"}"#).expect("parse");
assert_eq!(req.database.as_deref(), Some("mydb"));
}
}