use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct DocsMcpConfig {
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub sources: Vec<PathBuf>,
#[serde(default)]
pub output: Option<PathBuf>,
#[serde(default)]
pub adopt_existing: bool,
#[serde(default)]
pub declared: Vec<DeclaredMcpItem>,
}
impl DocsMcpConfig {
#[must_use]
pub fn merge(workspace: Option<&Self>, krate: Option<&Self>) -> Option<Self> {
if workspace.is_none() && krate.is_none() {
return None;
}
let sources = krate
.filter(|cfg| !cfg.sources.is_empty())
.map(|cfg| cfg.sources.clone())
.or_else(|| {
workspace
.filter(|cfg| !cfg.sources.is_empty())
.map(|cfg| cfg.sources.clone())
})
.unwrap_or_default();
let declared = krate
.filter(|cfg| !cfg.declared.is_empty())
.map(|cfg| cfg.declared.clone())
.or_else(|| {
workspace
.filter(|cfg| !cfg.declared.is_empty())
.map(|cfg| cfg.declared.clone())
})
.unwrap_or_default();
Some(Self {
enabled: krate
.and_then(|cfg| cfg.enabled)
.or_else(|| workspace.and_then(|cfg| cfg.enabled)),
sources,
output: krate
.and_then(|cfg| cfg.output.clone())
.or_else(|| workspace.and_then(|cfg| cfg.output.clone())),
adopt_existing: krate
.map(|cfg| cfg.adopt_existing)
.unwrap_or_else(|| workspace.map(|cfg| cfg.adopt_existing).unwrap_or(false)),
declared,
})
}
#[must_use]
pub fn is_enabled(&self) -> bool {
self.enabled.unwrap_or(true)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct DeclaredMcpItem {
pub kind: DeclaredMcpKind,
pub name: String,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub params_type: Option<String>,
#[serde(default)]
pub annotations: BTreeMap<String, String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DeclaredMcpKind {
Tool,
Prompt,
Resource,
}