summaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/codegen/mod.rs71
1 files changed, 66 insertions, 5 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index 5ce8425..c8b789b 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -1,10 +1,34 @@
+use rust_format::{Config, Edition, Formatter, RustFmt};
+
use crate::types::{props::Props, rendered_element::RenderedElement, ElementName};
+impl Props {
+ pub fn codegen(&self) -> String {
+ let mut props_string = String::new();
+
+ match self.spacing {
+ Some(s) => {
+ props_string = format!("{props_string}.spacing({s})");
+ }
+ None => {}
+ }
+
+ match self.max_height {
+ Some(h) => {
+ props_string = format!("{props_string}.max_height({h})");
+ }
+ None => {}
+ }
+
+ props_string
+ }
+}
+
impl RenderedElement {
- pub fn codegen(&self) -> (String, String) {
+ fn codegen(&self) -> (String, String) {
let mut imports = String::new();
let mut view = String::new();
- let mut props = String::new();
+ let props = self.props.codegen();
let mut elements = String::new();
@@ -17,7 +41,7 @@ impl RenderedElement {
match &self.name {
ElementName::Container => {
- imports = format!("{imports}\nuse iced::widget::container;");
+ imports = format!("{imports}widget::container,");
view = if self.child_elements.len() < 2 {
format!("{view}\ncontainer({elements}){props}")
} else {
@@ -25,11 +49,11 @@ impl RenderedElement {
};
}
ElementName::Row => {
- imports = format!("{imports}\nuse iced::widget::row;");
+ imports = format!("{imports}widget::row,");
view = format!("{view}\nrow![{elements}]{props}");
}
ElementName::Text(string) => {
- imports = format!("{imports}\nuse iced::widget::text;");
+ imports = format!("{imports}widget::text,");
view = format!("{view}\ntext(\"{string}\"){props}");
}
_ => {}
@@ -37,4 +61,41 @@ impl RenderedElement {
(imports, view)
}
+
+ pub fn app_code(&self, title: String) -> Result<String, Box<dyn std::error::Error>> {
+ let (imports, view) = self.codegen();
+ let mut app_code = format!("use iced::{{{imports}Sandbox,Settings,Element}};");
+
+ app_code = format!(
+ r#"{app_code}
+
+ fn main() -> iced::Result {{
+ App::run(Settings::default())
+ }}
+
+ struct App;
+
+ impl Sandbox for App {{
+ type Message = ();
+
+ fn new() -> Self {{
+ Self {{}}
+ }}
+
+ fn title(&self) -> String {{
+ "{title}".into()
+ }}
+
+ fn update(&mut self, message: Message) {{
+
+ }}
+
+ fn view(&self) -> Element<Message> {{
+ {view}.into()
+ }}
+ }}"#
+ );
+
+ Ok(RustFmt::default().format_str(app_code)?)
+ }
}