use crate::data_lookup_holder::DataLookupHolder;
use hcl::edit::expr::Expression;
use hcl::edit::structure::AttributeMut;
use hcl::edit::visit_mut::VisitMut;
use hcl::edit::visit_mut::visit_attr_mut;
use hcl::edit::visit_mut::visit_block_mut;
pub struct DataReferencePatcher {
pub lookup: DataLookupHolder,
}
impl From<DataLookupHolder> for DataReferencePatcher {
fn from(lookup: DataLookupHolder) -> Self {
DataReferencePatcher { lookup }
}
}
impl VisitMut for DataReferencePatcher {
fn visit_block_mut(&mut self, node: &mut hcl::edit::structure::Block) {
if node.ident.as_str() != "import" {
visit_block_mut(self, node)
}
}
fn visit_attr_mut(&mut self, mut node: AttributeMut) {
let Some(resource_id) = node.value.as_str() else {
visit_attr_mut(self, node);
return;
};
let resource_id = resource_id.into();
let reference = match self.lookup.data_references_by_id.get(&resource_id) {
Some(x) => x,
None => {
return;
}
};
let Ok(expr) = reference.id_expression_str().parse::<Expression>() else {
return;
};
*node.value_mut() = expr;
}
}