diff options
Diffstat (limited to 'src/codegen/mod.rs')
| -rw-r--r-- | src/codegen/mod.rs | 71 |
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)?) + } } |
