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}