use crate::diagnostics::{categories, Diagnostic, ValidationReport};
pub const BIND_CAPABILITY_FAILED: &str = "DPCS-BIND-001";
pub const BIND_UNKNOWN_TARGET: &str = "DPCS-BIND-002";
pub const BIND_TRANSLATION_INCOMPLETE: &str = "DPCS-BIND-003";
pub const BIND_WRITE_FAILED: &str = "DPCS-BIND-004";
pub fn capability_gate_failed() -> Diagnostic {
Diagnostic::binding_error(
BIND_CAPABILITY_FAILED,
categories::BINDING,
"orchestrator binding requires a successful capability match",
)
.with_remediation(
"Resolve missing mandatory capabilities in the profile, or adjust pipeline execution requirements",
)
}
pub fn unknown_target(target: &str) -> Diagnostic {
Diagnostic::binding_error(
BIND_UNKNOWN_TARGET,
categories::BINDING,
format!("unknown binding target `{target}`"),
)
.with_remediation("Use one of: airflow, dagster, prefect, temporal, kubernetes")
}
pub fn translation_incomplete(message: impl Into<String>) -> Diagnostic {
Diagnostic::binding_error(BIND_TRANSLATION_INCOMPLETE, categories::BINDING, message)
.with_remediation("Simplify the plan semantic or choose a different binding target")
}
pub fn write_failed(message: impl Into<String>) -> Diagnostic {
Diagnostic::binding_error(BIND_WRITE_FAILED, categories::BINDING, message)
.with_remediation("Check output path permissions and disk space")
}
pub fn report_capability_gate(capability_diagnostics: ValidationReport) -> ValidationReport {
let mut report = ValidationReport::new();
report.push(capability_gate_failed());
report.extend(capability_diagnostics);
report.sort_deterministic();
report
}
pub fn report_error(diagnostic: Diagnostic) -> ValidationReport {
let mut report = ValidationReport::new();
report.push(diagnostic);
report.sort_deterministic();
report
}