Module visit_mut

Source
Expand description

Mutable HCL language item traversal.

Each method of the VisitMut trait is a hook that can be overridden to customize the behavior when mutating the corresponding type of language item. By default, every method recursively visits the substructure of the AST by invoking the right visitor method of each of its fields.

The API is modeled after syn::visit_mut. For an alternative that works on shared borrows, see hcl_edit::visit.

§Examples

Namespace all referenced variables with var.:

use hcl_edit::expr::{Expression, Traversal, TraversalOperator};
use hcl_edit::prelude::*;
use hcl_edit::structure::Body;
use hcl_edit::visit_mut::{visit_expr_mut, VisitMut};
use hcl_edit::{Decorated, Ident};
use std::str::FromStr;

struct VariableNamespacer {
    namespace: Decorated<Ident>,
}

impl VisitMut for VariableNamespacer {
    fn visit_expr_mut(&mut self, expr: & mut Expression) {
        if let Expression::Variable(var) = expr {
            // Remove the decor and apply it to the new expression.
            let decor = std::mem::take(var.decor_mut());

            let namespace = Expression::Variable(self.namespace.clone());
            let operators = vec![Decorated::new(TraversalOperator::GetAttr(var.clone()))];
            let traversal = Traversal::new(namespace, operators);

            *expr = Expression::from(traversal).decorated(decor);
        } else {
            // Recurse further down the AST.
            visit_expr_mut(self, expr);
        }
    }
}

let input = r#"
    // A service definition.
    service {
        fullname        = "${namespace}/${name}"
        health_endpoint = "${base_url}/health"
    }
"#;

let mut body = input.parse::<Body>()?;

let mut visitor = VariableNamespacer {
    namespace: Decorated::new(Ident::new("var")),
};

visitor.visit_body_mut(&mut body);

let expected = r#"
    // A service definition.
    service {
        fullname        = "${var.namespace}/${var.name}"
        health_endpoint = "${var.base_url}/health"
    }
"#;

assert_eq!(body.to_string(), expected);

Traits§

VisitMut
Traversal to walk a mutable borrow of an HCL language item.

Functions§

visit_array_mut
visit_attr_mut
visit_binary_op_mut
visit_block_label_mut
visit_block_mut
visit_body_mut
visit_conditional_mut
visit_directive_mut
visit_element_mut
visit_else_template_expr_mut
visit_expr_mut
visit_for_cond_mut
visit_for_directive_mut
visit_for_expr_mut
visit_for_intro_mut
visit_for_template_expr_mut
visit_func_args_mut
visit_func_call_mut
visit_func_name_mut
visit_heredoc_template_mut
visit_if_directive_mut
visit_if_template_expr_mut
visit_interpolation_mut
visit_object_item_mut
visit_object_mut
visit_object_value_mut
visit_parenthesis_mut
visit_string_template_mut
visit_structure_mut
visit_template_mut
visit_traversal_mut
visit_traversal_operator_mut
visit_unary_op_mut