diff --git a/slhx-build/src/lib.rs b/slhx-build/src/lib.rs index 43ceda1..da859dc 100644 --- a/slhx-build/src/lib.rs +++ b/slhx-build/src/lib.rs @@ -67,6 +67,7 @@ pub fn app() -> AppBuilder { struct Resources { slots: BTreeMap, handles: BTreeMap, + handle_forms: BTreeMap, forms: BTreeMap, atoms: BTreeMap, } @@ -136,7 +137,10 @@ impl Resources { .collect() }) .unwrap_or_default(); - self.insert_form(canonical_symbol(root, path, &form_name), form_name, component.clone(), controls)?; + self.insert_form(canonical_symbol(root, path, &form_name), form_name.clone(), component.clone(), controls)?; + if let (Some(handle_ident), Some(form_ident)) = (rust_ident(&name), rust_ident(&form_name)) { + self.handle_forms.insert(handle_ident, form_ident); + } } } } @@ -231,8 +235,13 @@ impl Resources { out.push_str(&format!("{pad}#[allow(non_upper_case_globals)]\n{pad}pub mod handles {{\n")); for res in self.handles.values().filter(|res| component_matches(res, component)) { handle_ids.push(res.id); + let input = if self.handle_forms.contains_key(&res.ident) { + "::slhx::Form<::std::string::String>" + } else { + "()" + }; out.push_str(&format!( - "{inner}pub const {}: ::slhx::Handle<()> = ::slhx::Handle::new({});\n", + "{inner}pub const {}: ::slhx::Handle<{input}> = ::slhx::Handle::new({});\n", res.ident, res.id )); } @@ -681,6 +690,7 @@ mod tests { #[test] fn emits_generated_resources_from_heml() { + // req: codegen/003 let base = test_dir("slhx-build-test"); let templates = base.join("templates"); let out = base.join("out"); @@ -698,7 +708,7 @@ mod tests { assert!(generated.contains("pub mod slots")); assert!(generated.contains("pub const todos")); assert!(generated.contains("pub mod handles")); - assert!(generated.contains("pub const create")); + assert!(generated.contains("pub const create: ::slhx::Handle<::slhx::Form<::std::string::String>>")); assert!(generated.contains("pub mod forms")); assert!(generated.contains("pub mod atoms")); assert!(generated.contains("pub const filter"));