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§
- Visit
Mut - 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