feat(build): type generated form handles

req: codegen/003
This commit is contained in:
slhx agent
2026-05-10 23:37:11 +02:00
parent af813edd52
commit 0a50487a3a
+13 -3
View File
@@ -67,6 +67,7 @@ pub fn app() -> AppBuilder {
struct Resources { struct Resources {
slots: BTreeMap<String, Resource>, slots: BTreeMap<String, Resource>,
handles: BTreeMap<String, Resource>, handles: BTreeMap<String, Resource>,
handle_forms: BTreeMap<String, String>,
forms: BTreeMap<String, FormResource>, forms: BTreeMap<String, FormResource>,
atoms: BTreeMap<String, Resource>, atoms: BTreeMap<String, Resource>,
} }
@@ -136,7 +137,10 @@ impl Resources {
.collect() .collect()
}) })
.unwrap_or_default(); .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")); 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)) { for res in self.handles.values().filter(|res| component_matches(res, component)) {
handle_ids.push(res.id); 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!( 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 res.ident, res.id
)); ));
} }
@@ -681,6 +690,7 @@ mod tests {
#[test] #[test]
fn emits_generated_resources_from_heml() { fn emits_generated_resources_from_heml() {
// req: codegen/003
let base = test_dir("slhx-build-test"); let base = test_dir("slhx-build-test");
let templates = base.join("templates"); let templates = base.join("templates");
let out = base.join("out"); let out = base.join("out");
@@ -698,7 +708,7 @@ mod tests {
assert!(generated.contains("pub mod slots")); assert!(generated.contains("pub mod slots"));
assert!(generated.contains("pub const todos")); assert!(generated.contains("pub const todos"));
assert!(generated.contains("pub mod handles")); 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 forms"));
assert!(generated.contains("pub mod atoms")); assert!(generated.contains("pub mod atoms"));
assert!(generated.contains("pub const filter")); assert!(generated.contains("pub const filter"));