pub use fraiseql_core::schema::McpConfig;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct ValidationConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_query_depth: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_query_complexity: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_response_bytes: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_page_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_offset: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_semi_additive_cells: Option<u64>,
}
impl ValidationConfig {
pub fn validate(&self) -> anyhow::Result<()> {
if self.max_offset == Some(0) {
anyhow::bail!(
"[validation] max_offset = 0 would refuse every offset page. Set the deepest \
offset clients may page to, or leave the key unset for no ceiling."
);
}
if self.max_semi_additive_cells == Some(0) {
anyhow::bail!(
"[validation] max_semi_additive_cells = 0 would refuse every aggregate over a \
semi-additive measure. Set the most cells such an aggregate may read, or leave \
the key unset for the default."
);
}
Ok(())
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct DebugConfig {
pub enabled: bool,
pub database_explain: bool,
pub expose_sql: bool,
}
impl Default for DebugConfig {
fn default() -> Self {
Self {
enabled: false,
database_explain: false,
expose_sql: true,
}
}
}