hcl/expr/
edit.rs

1use super::*;
2use crate::edit::{expr, template, Decorated, Ident};
3
4impl From<expr::Expression> for Expression {
5    fn from(value: expr::Expression) -> Self {
6        match value {
7            expr::Expression::Null(_) => Expression::Null,
8            expr::Expression::Bool(b) => b.value_into(),
9            expr::Expression::Array(array) => Expression::from_iter(array),
10            expr::Expression::Number(num) => num.value_into(),
11            expr::Expression::String(string) => string.value_into(),
12            expr::Expression::Object(object) => Expression::from_iter(object),
13            expr::Expression::UnaryOp(unary) => UnaryOp::from(*unary).into(),
14            expr::Expression::BinaryOp(binary) => BinaryOp::from(*binary).into(),
15            expr::Expression::ForExpr(for_expr) => ForExpr::from(*for_expr).into(),
16            expr::Expression::StringTemplate(template) => TemplateExpr::from(template).into(),
17            expr::Expression::HeredocTemplate(template) => Heredoc::from(*template).into(),
18            expr::Expression::Variable(variable) => Expression::Variable(variable.value_into()),
19            expr::Expression::FuncCall(func_call) => FuncCall::from(*func_call).into(),
20            expr::Expression::Traversal(traversal) => Traversal::from(*traversal).into(),
21            expr::Expression::Parenthesis(parens) => {
22                Expression::Parenthesis(Box::new(parens.into_inner().into()))
23            }
24            expr::Expression::Conditional(cond) => Conditional::from(*cond).into(),
25        }
26    }
27}
28
29impl From<Expression> for expr::Expression {
30    fn from(value: Expression) -> Self {
31        match value {
32            Expression::Null => expr::Expression::null(),
33            Expression::Bool(b) => b.into(),
34            Expression::Array(array) => expr::Expression::from_iter(array),
35            Expression::Number(num) => num.into(),
36            Expression::String(string) => string.into(),
37            Expression::Object(object) => expr::Expression::from_iter(object),
38            Expression::Operation(op) => match *op {
39                Operation::Unary(unary) => expr::UnaryOp::from(unary).into(),
40                Operation::Binary(binary) => expr::BinaryOp::from(binary).into(),
41            },
42            Expression::ForExpr(for_expr) => expr::ForExpr::from(*for_expr).into(),
43            Expression::TemplateExpr(template) => match *template {
44                TemplateExpr::Heredoc(heredoc) => template::HeredocTemplate::from(heredoc).into(),
45                TemplateExpr::QuotedString(template) => {
46                    template::StringTemplate::from(template_or_default(template)).into()
47                }
48            },
49            Expression::Variable(variable) => {
50                expr::Expression::Variable(variable.into_inner().into())
51            }
52            Expression::FuncCall(func_call) => expr::FuncCall::from(*func_call).into(),
53            Expression::Traversal(traversal) => expr::Traversal::from(*traversal).into(),
54            Expression::Parenthesis(parens) => expr::Parenthesis::new((*parens).into()).into(),
55            Expression::Conditional(cond) => expr::Conditional::from(*cond).into(),
56        }
57    }
58}
59
60impl From<expr::ObjectKey> for ObjectKey {
61    fn from(value: expr::ObjectKey) -> Self {
62        match value {
63            expr::ObjectKey::Ident(ident) => ObjectKey::Identifier(ident.into()),
64            expr::ObjectKey::Expression(expr) => ObjectKey::Expression(expr.into()),
65        }
66    }
67}
68
69impl From<ObjectKey> for expr::ObjectKey {
70    fn from(value: ObjectKey) -> Self {
71        match value {
72            ObjectKey::Identifier(ident) => expr::ObjectKey::Ident(ident.into()),
73            ObjectKey::Expression(expr) => expr::ObjectKey::Expression(expr.into()),
74        }
75    }
76}
77
78impl From<expr::ObjectValue> for Expression {
79    fn from(value: expr::ObjectValue) -> Self {
80        value.into_expr().into()
81    }
82}
83
84impl From<Expression> for expr::ObjectValue {
85    fn from(value: Expression) -> Self {
86        expr::ObjectValue::new(value)
87    }
88}
89
90impl From<expr::Conditional> for Conditional {
91    fn from(value: expr::Conditional) -> Self {
92        Conditional::new(value.cond_expr, value.true_expr, value.false_expr)
93    }
94}
95
96impl From<Conditional> for expr::Conditional {
97    fn from(value: Conditional) -> Self {
98        expr::Conditional::new(value.cond_expr, value.true_expr, value.false_expr)
99    }
100}
101
102impl From<expr::ForExpr> for ForExpr {
103    fn from(value: expr::ForExpr) -> Self {
104        let intro = value.intro;
105        ForExpr {
106            key_var: intro.key_var.map(Into::into),
107            value_var: intro.value_var.into(),
108            collection_expr: intro.collection_expr.into(),
109            key_expr: value.key_expr.map(Into::into),
110            value_expr: value.value_expr.into(),
111            grouping: value.grouping,
112            cond_expr: value.cond.map(|cond| cond.expr.into()),
113        }
114    }
115}
116
117impl From<ForExpr> for expr::ForExpr {
118    fn from(value: ForExpr) -> Self {
119        let mut intro = expr::ForIntro::new(value.value_var, value.collection_expr);
120        intro.key_var = value.key_var.map(Into::into);
121
122        let mut for_expr = expr::ForExpr::new(intro, value.value_expr);
123        for_expr.key_expr = value.key_expr.map(Into::into);
124        for_expr.grouping = value.grouping;
125        for_expr.cond = value.cond_expr.map(expr::ForCond::new);
126        for_expr
127    }
128}
129
130impl From<expr::FuncName> for FuncName {
131    fn from(value: expr::FuncName) -> Self {
132        FuncName {
133            namespace: value.namespace.into_iter().map(Into::into).collect(),
134            name: value.name.into(),
135        }
136    }
137}
138
139impl From<FuncName> for expr::FuncName {
140    fn from(value: FuncName) -> Self {
141        expr::FuncName {
142            namespace: value.namespace.into_iter().map(Into::into).collect(),
143            name: value.name.into(),
144        }
145    }
146}
147
148impl From<expr::FuncCall> for FuncCall {
149    fn from(value: expr::FuncCall) -> Self {
150        let expand_final = value.args.expand_final();
151        FuncCall {
152            name: value.name.into(),
153            args: value.args.into_iter().map(Into::into).collect(),
154            expand_final,
155        }
156    }
157}
158
159impl From<FuncCall> for expr::FuncCall {
160    fn from(value: FuncCall) -> Self {
161        let mut args = expr::FuncArgs::from_iter(value.args);
162        args.set_expand_final(value.expand_final);
163        expr::FuncCall::new(value.name, args)
164    }
165}
166
167impl From<expr::UnaryOp> for Operation {
168    fn from(value: expr::UnaryOp) -> Self {
169        Operation::Unary(value.into())
170    }
171}
172
173impl From<expr::BinaryOp> for Operation {
174    fn from(value: expr::BinaryOp) -> Self {
175        Operation::Binary(value.into())
176    }
177}
178
179impl From<expr::UnaryOp> for UnaryOp {
180    fn from(value: expr::UnaryOp) -> Self {
181        UnaryOp::new(value.operator.value_into(), value.expr)
182    }
183}
184
185impl From<UnaryOp> for expr::UnaryOp {
186    fn from(value: UnaryOp) -> Self {
187        expr::UnaryOp::new(value.operator, value.expr)
188    }
189}
190
191impl From<expr::BinaryOp> for BinaryOp {
192    fn from(value: expr::BinaryOp) -> Self {
193        BinaryOp::new(value.lhs_expr, value.operator.value_into(), value.rhs_expr)
194    }
195}
196
197impl From<BinaryOp> for expr::BinaryOp {
198    fn from(value: BinaryOp) -> Self {
199        expr::BinaryOp::new(value.lhs_expr, value.operator, value.rhs_expr)
200    }
201}
202
203impl From<template::StringTemplate> for TemplateExpr {
204    fn from(value: template::StringTemplate) -> Self {
205        TemplateExpr::QuotedString(template::Template::from(value).to_string())
206    }
207}
208
209impl From<template::HeredocTemplate> for Heredoc {
210    fn from(value: template::HeredocTemplate) -> Self {
211        let strip = value
212            .indent()
213            .map_or(HeredocStripMode::None, |_| HeredocStripMode::Indent);
214
215        Heredoc {
216            delimiter: value.delimiter.into(),
217            template: value.template.to_string(),
218            strip,
219        }
220    }
221}
222
223impl From<Heredoc> for template::HeredocTemplate {
224    fn from(value: Heredoc) -> Self {
225        template::HeredocTemplate::new(value.delimiter.into(), template_or_default(value.template))
226    }
227}
228
229impl From<expr::Traversal> for Traversal {
230    fn from(value: expr::Traversal) -> Self {
231        Traversal::new(value.expr, value.operators)
232    }
233}
234
235impl From<Traversal> for expr::Traversal {
236    fn from(value: Traversal) -> Self {
237        expr::Traversal::new(
238            value.expr,
239            value.operators.into_iter().map(Into::into).collect(),
240        )
241    }
242}
243
244impl From<Decorated<expr::TraversalOperator>> for TraversalOperator {
245    fn from(value: Decorated<expr::TraversalOperator>) -> Self {
246        value.value_into()
247    }
248}
249
250impl From<TraversalOperator> for Decorated<expr::TraversalOperator> {
251    fn from(value: TraversalOperator) -> Self {
252        Decorated::new(value.into())
253    }
254}
255
256impl From<expr::TraversalOperator> for TraversalOperator {
257    fn from(value: expr::TraversalOperator) -> Self {
258        match value {
259            expr::TraversalOperator::Index(index) => Expression::from(index).into(),
260            expr::TraversalOperator::GetAttr(ident) => ident.into(),
261            expr::TraversalOperator::AttrSplat(_) => TraversalOperator::AttrSplat,
262            expr::TraversalOperator::FullSplat(_) => TraversalOperator::FullSplat,
263            expr::TraversalOperator::LegacyIndex(index) => index.value_into(),
264        }
265    }
266}
267
268impl From<TraversalOperator> for expr::TraversalOperator {
269    fn from(value: TraversalOperator) -> Self {
270        match value {
271            TraversalOperator::Index(index) => expr::TraversalOperator::Index(index.into()),
272            TraversalOperator::GetAttr(ident) => expr::TraversalOperator::GetAttr(ident.into()),
273            TraversalOperator::AttrSplat => expr::TraversalOperator::AttrSplat(expr::Splat.into()),
274            TraversalOperator::FullSplat => expr::TraversalOperator::FullSplat(expr::Splat.into()),
275            TraversalOperator::LegacyIndex(index) => {
276                expr::TraversalOperator::LegacyIndex(index.into())
277            }
278        }
279    }
280}
281
282impl From<Ident> for Variable {
283    fn from(ident: Ident) -> Self {
284        Identifier::from(ident).into()
285    }
286}
287
288impl From<Decorated<Ident>> for Identifier {
289    fn from(value: Decorated<Ident>) -> Self {
290        value.value_into()
291    }
292}
293
294impl From<Identifier> for Decorated<Ident> {
295    fn from(value: Identifier) -> Self {
296        Decorated::new(value.into())
297    }
298}
299
300fn template_or_default<T: AsRef<str>>(s: T) -> template::Template {
301    s.as_ref().parse().unwrap_or_default()
302}