summaryrefslogtreecommitdiff
path: root/src/codegen/mod.rs
blob: 5ce842532411744773e90a9a8ff127fd223dc9eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use crate::types::{props::Props, rendered_element::RenderedElement, ElementName};

impl RenderedElement {
    pub fn codegen(&self) -> (String, String) {
        let mut imports = String::new();
        let mut view = String::new();
        let mut props = String::new();

        let mut elements = String::new();

        for element in &self.child_elements {
            let mut children = String::new();

            (imports, children) = element.codegen();
            elements = format!("{elements}{},", children);
        }

        match &self.name {
            ElementName::Container => {
                imports = format!("{imports}\nuse iced::widget::container;");
                view = if self.child_elements.len() < 2 {
                    format!("{view}\ncontainer({elements}){props}")
                } else {
                    format!("{view}\ncontainer(){props}")
                };
            }
            ElementName::Row => {
                imports = format!("{imports}\nuse iced::widget::row;");
                view = format!("{view}\nrow![{elements}]{props}");
            }
            ElementName::Text(string) => {
                imports = format!("{imports}\nuse iced::widget::text;");
                view = format!("{view}\ntext(\"{string}\"){props}");
            }
            _ => {}
        }

        (imports, view)
    }
}