pub mod router;
use rmcp::schemars;
use serde::Deserialize;
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct MasterWorkflowArgs {
pub goal: Option<String>,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct SqlAgentJobsArgs {
pub job_name: Option<String>,
pub database: Option<String>,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct IndexesConstraintsArgs {
pub database: Option<String>,
pub schema: Option<String>,
pub table: Option<String>,
}
#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct SecurityProvisioningArgs {
pub login_name: Option<String>,
pub database: Option<String>,
pub role_name: Option<String>,
}
pub(crate) fn render_context_header(fields: &[(&str, Option<&str>)]) -> String {
if fields.is_empty() {
return String::new();
}
let mut provided = Vec::new();
let mut missing = Vec::new();
for (label, value) in fields {
match value {
Some(v) => provided.push(format!("- {label}: {v}")),
None => missing.push(format!("- {label}")),
}
}
let render_list = |items: &[String]| {
if items.is_empty() {
"(none)".to_string()
} else {
items.join("\n")
}
};
format!(
"Context already provided:\n{}\n\nStill missing (ask the user before proceeding, if needed):\n{}\n",
render_list(&provided),
render_list(&missing),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_fields_render_nothing() {
assert_eq!(render_context_header(&[]), "");
}
#[test]
fn all_supplied_lists_no_missing_fields() {
let header = render_context_header(&[("goal", Some("explore schema"))]);
assert!(header.contains("- goal: explore schema"));
assert!(header.contains("Still missing"));
assert!(header.ends_with("(none)\n"));
}
#[test]
fn all_missing_lists_no_provided_fields() {
let header = render_context_header(&[("goal", None)]);
assert!(header.starts_with("Context already provided:\n(none)"));
assert!(header.contains("- goal"));
}
#[test]
fn mixed_supplied_and_missing_are_both_listed() {
let header =
render_context_header(&[("job_name", Some("nightly_backup")), ("database", None)]);
assert!(header.contains("- job_name: nightly_backup"));
assert!(header.contains("- database"));
assert!(!header.contains("- database: "));
}
}