1use super::*;
2use crate::edit::template;
3
4impl From<template::Template> for Template {
5 fn from(value: template::Template) -> Self {
6 Template::from_iter(value)
7 }
8}
9
10impl From<Template> for template::Template {
11 fn from(value: Template) -> Self {
12 template::Template::from_iter(value.elements)
13 }
14}
15
16impl From<template::Element> for Element {
17 fn from(value: template::Element) -> Self {
18 match value {
19 template::Element::Literal(literal) => Element::Literal(literal.value_into()),
20 template::Element::Directive(directive) => {
21 Element::Directive(Box::new((*directive).into()))
22 }
23 template::Element::Interpolation(interp) => Element::Interpolation(interp.into()),
24 }
25 }
26}
27
28impl From<Element> for template::Element {
29 fn from(value: Element) -> Self {
30 match value {
31 Element::Literal(literal) => template::Element::Literal(literal.into()),
32 Element::Directive(directive) => {
33 template::Element::Directive(Box::new((*directive).into()))
34 }
35 Element::Interpolation(interp) => template::Element::Interpolation(interp.into()),
36 }
37 }
38}
39
40impl From<template::Interpolation> for Interpolation {
41 fn from(value: template::Interpolation) -> Self {
42 Interpolation {
43 expr: value.expr.into(),
44 strip: value.strip,
45 }
46 }
47}
48
49impl From<Interpolation> for template::Interpolation {
50 fn from(value: Interpolation) -> Self {
51 let mut interp = template::Interpolation::new(value.expr);
52 interp.strip = value.strip;
53 interp
54 }
55}
56
57impl From<template::Directive> for Directive {
58 fn from(value: template::Directive) -> Self {
59 match value {
60 template::Directive::If(directive) => Directive::If(directive.into()),
61 template::Directive::For(directive) => Directive::For(directive.into()),
62 }
63 }
64}
65
66impl From<Directive> for template::Directive {
67 fn from(value: Directive) -> Self {
68 match value {
69 Directive::If(directive) => template::Directive::If(directive.into()),
70 Directive::For(directive) => template::Directive::For(directive.into()),
71 }
72 }
73}
74
75impl From<template::IfDirective> for IfDirective {
76 fn from(value: template::IfDirective) -> Self {
77 let else_strip = value
78 .else_expr
79 .as_ref()
80 .map(|expr| expr.strip)
81 .unwrap_or_default();
82
83 IfDirective {
84 cond_expr: value.if_expr.cond_expr.into(),
85 true_template: value.if_expr.template.into(),
86 false_template: value.else_expr.map(|expr| expr.template.into()),
87 if_strip: value.if_expr.strip,
88 else_strip,
89 endif_strip: value.endif_expr.strip,
90 }
91 }
92}
93
94impl From<IfDirective> for template::IfDirective {
95 fn from(value: IfDirective) -> Self {
96 let mut if_expr =
97 template::IfTemplateExpr::new(value.cond_expr, value.true_template.into());
98 if_expr.strip = value.if_strip;
99
100 let else_expr = value.false_template.map(|template| {
101 let mut else_expr = template::ElseTemplateExpr::new(template.into());
102 else_expr.strip = value.else_strip;
103 else_expr
104 });
105
106 let mut endif_expr = template::EndifTemplateExpr::new();
107 endif_expr.strip = value.endif_strip;
108
109 template::IfDirective::new(if_expr, else_expr, endif_expr)
110 }
111}
112
113impl From<template::ForDirective> for ForDirective {
114 fn from(value: template::ForDirective) -> Self {
115 let for_expr = value.for_expr;
116 let endfor_expr = value.endfor_expr;
117
118 ForDirective {
119 key_var: for_expr.key_var.map(Into::into),
120 value_var: for_expr.value_var.into(),
121 collection_expr: for_expr.collection_expr.into(),
122 template: for_expr.template.into(),
123 for_strip: for_expr.strip,
124 endfor_strip: endfor_expr.strip,
125 }
126 }
127}
128
129impl From<ForDirective> for template::ForDirective {
130 fn from(value: ForDirective) -> Self {
131 let mut for_expr = template::ForTemplateExpr::new(
132 value.key_var,
133 value.value_var,
134 value.collection_expr,
135 value.template.into(),
136 );
137 for_expr.strip = value.for_strip;
138
139 let mut endfor_expr = template::EndforTemplateExpr::new();
140 endfor_expr.strip = value.endfor_strip;
141
142 template::ForDirective::new(for_expr, endfor_expr)
143 }
144}