use std::collections::BTreeMap;
use std::rc::Rc;
use helm_schema_ast::DefineIndex;
use crate::analysis_db::IrAnalysisDb;
use crate::contract::ContractIr;
#[derive(Clone, Debug, Default)]
pub struct SymbolicPolicy {
pub chart_default_strings: BTreeMap<String, String>,
pub kubernetes_version: Option<String>,
pub static_root_strings: BTreeMap<Vec<String>, String>,
}
#[derive(Clone)]
pub struct SymbolicIrContext {
analysis_db: Rc<IrAnalysisDb>,
}
impl SymbolicIrContext {
#[tracing::instrument(skip_all)]
pub fn new(defines: &DefineIndex) -> Self {
Self {
analysis_db: Rc::new(IrAnalysisDb::new(defines)),
}
}
#[must_use]
pub fn with_chart_default_strings(
defines: &DefineIndex,
chart_default_strings: BTreeMap<String, String>,
) -> Self {
Self::with_policy(
defines,
SymbolicPolicy {
chart_default_strings,
..SymbolicPolicy::default()
},
)
}
#[must_use]
pub fn with_policy(defines: &DefineIndex, policy: SymbolicPolicy) -> Self {
Self {
analysis_db: Rc::new(IrAnalysisDb::with_policy(defines, policy)),
}
}
#[must_use]
pub fn generate_contract_ir(&self, src: &str) -> ContractIr {
self.generate_contract_ir_with_provenance(src, None)
}
#[must_use]
pub fn generate_contract_ir_for_source(&self, src: &str, source_path: &str) -> ContractIr {
self.generate_contract_ir_with_provenance(src, Some(source_path))
}
#[must_use]
#[cfg(test)]
pub(crate) fn eval_document_fragment(
&self,
src: &str,
) -> crate::fragment_eval::EvaluatedDocument {
crate::fragment_eval::eval_document(src, None, &self.analysis_db)
}
fn generate_contract_ir_with_provenance(
&self,
src: &str,
source_path: Option<&str>,
) -> ContractIr {
let document = crate::fragment_eval::eval_document(src, source_path, &self.analysis_db);
let mut contract = crate::fragment_eval::contract_ir_from_document(&document);
for name in &document.observed_facts.values_root_helper_includes {
contract.extend_values_program_wrappers(
self.analysis_db
.program_wrapper_sentinels(name)
.into_iter()
.map(|(key, spread)| helm_schema_core::ValuesProgramWrapper {
scope_path: helm_schema_core::ValuesPath::default(),
key,
spread,
}),
);
}
contract.extend_values_program_wrapper_exclusions(
document.pre_rewrite_strict_paths.iter().cloned(),
);
contract
}
}