use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EngineCapabilityDeclaration {
pub engine_id: String,
pub engine_version: String,
pub capability_version: String,
pub categories: CapabilityCategories,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CapabilityCategories {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub logical_types: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub semantic_actions: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub functions: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub rules: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub operators: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub runtime_features: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CapabilityGap {
pub category: String,
pub required: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CapabilityMatchReport {
pub supported: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub missing: Vec<CapabilityGap>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub diagnostics: Vec<crate::diagnostics::Diagnostic>,
}
impl CapabilityMatchReport {
#[must_use]
pub fn is_valid(&self) -> bool {
self.supported && !self.diagnostics.iter().any(|d| d.severity.is_error())
}
}