use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ImplementationClass {
Parser,
Validator,
Analyzer,
Planner,
Optimizer,
Compiler,
Runtime,
IntegratedPlatform,
}
impl ImplementationClass {
#[must_use]
pub fn profile_id(self) -> &'static str {
match self {
Self::Parser => "parser",
Self::Validator => "validator",
Self::Analyzer => "analyzer",
Self::Planner => "planner",
Self::Optimizer => "optimizer",
Self::Compiler => "compiler",
Self::Runtime => "runtime",
Self::IntegratedPlatform => "integrated-platform",
}
}
pub const ALL: [Self; 8] = [
Self::Parser,
Self::Validator,
Self::Analyzer,
Self::Planner,
Self::Optimizer,
Self::Compiler,
Self::Runtime,
Self::IntegratedPlatform,
];
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConformanceProfile {
pub id: String,
pub implementation_class: ImplementationClass,
pub dtcs_version: String,
pub implementation_version: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub supported_registries: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub supported_extensions: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub optional_capabilities: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ImplementationCapabilityDeclaration {
pub implementation_id: String,
pub implementation_version: String,
pub dtcs_version: String,
pub profiles: Vec<ConformanceProfile>,
pub primary_profile: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "camelCase")]
pub enum ConformanceAssertion {
ParseValid,
ParseInvalid,
ValidateValid,
ValidateInvalid {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
codes: Vec<String>,
},
AnalyzeValid,
CompatLevel {
#[serde(rename = "comparisonFixture")]
comparison_fixture: String,
level: String,
},
EvolveValid {
#[serde(rename = "comparisonFixture")]
comparison_fixture: String,
},
PlanValid,
OptimizeEquivalent,
MatchSupported,
CompileValid,
RuntimeOutput {
input: String,
#[serde(rename = "expectedOutput")]
expected_output: String,
},
RuntimeInvalid {
input: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
codes: Vec<String>,
},
SecurityProbe {
#[serde(rename = "probeId")]
probe_id: String,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConformanceTestCase {
pub id: String,
pub profiles: Vec<String>,
pub fixture: String,
#[serde(default = "default_yaml")]
pub format: String,
pub assertion: ConformanceAssertion,
}
fn default_yaml() -> String {
"yaml".into()
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConformanceManifest {
pub version: String,
pub tests: Vec<ConformanceTestCase>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConformanceTestResult {
pub id: String,
pub profile: String,
pub passed: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConformanceReport {
pub implementation_id: String,
pub implementation_version: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub profiles: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub results: Vec<ConformanceTestResult>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub security: Vec<ConformanceTestResult>,
pub passed: bool,
}
impl ConformanceReport {
#[must_use]
pub fn is_valid(&self) -> bool {
self.passed
}
}