diff options
Diffstat (limited to 'dhall')
-rw-r--r-- | dhall/src/lib.rs | 5 | ||||
-rw-r--r-- | dhall/src/syntax/ast/expr.rs | 13 |
2 files changed, 18 insertions, 0 deletions
diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index 4238b6e..f3a11a1 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -99,6 +99,11 @@ impl Parsed { pub fn to_expr(&self) -> Expr { self.0.clone() } + + pub fn substitute_name(self, label: syntax::Label, value: Expr) -> Parsed { + let Parsed (expr, import_location) = self; + Parsed (expr.substitute_name(label, value), import_location) + } } impl<'cx> Resolved<'cx> { diff --git a/dhall/src/syntax/ast/expr.rs b/dhall/src/syntax/ast/expr.rs index eba2735..bc3ffa4 100644 --- a/dhall/src/syntax/ast/expr.rs +++ b/dhall/src/syntax/ast/expr.rs @@ -182,6 +182,19 @@ impl Expr { let data = binary::encode(self)?; Ok(crate::utils::sha256_hash(&data)) } + + /// this wraps the expression into an additional let-binding + pub fn substitute_name(self, label: Label, value: Expr) -> Expr { + Expr::new( + ExprKind::Let( + label, + None, + value, + self + ), + Span::Artificial + ) + } } // Empty enum to indicate that no error can occur |