diff --git a/examples/techdemo/src/lib.rs b/examples/techdemo/src/lib.rs index 9e670a1..ff11ac7 100644 --- a/examples/techdemo/src/lib.rs +++ b/examples/techdemo/src/lib.rs @@ -5,7 +5,7 @@ pub mod ui {} mod tests { use super::ui; use hemplate::Hemplate; - use slhx::{IntoEffect, SafeHtml}; + use slhx::{Effect, IntoEffect, Payload, SafeHtml}; use slhx_test::inspect; #[derive(Hemplate)] @@ -14,6 +14,15 @@ mod tests { label: &'static str, } + #[allow(dead_code)] + #[derive(Clone, Debug)] + #[slhx::form("launch_work")] + struct LaunchWork { + title: String, + lane: String, + impact: Option, + } + // req: examples/001 req: codegen/002 req: public_api/001 #[test] fn techdemo_uses_generated_slots_for_multi_target_updates() { @@ -38,6 +47,22 @@ mod tests { ) } + // req: examples/001 req: form/001 req: form/004 req: form/006 req: derive_handler/003 + #[test] + fn techdemo_form_handler_is_checked_against_hemplate_form() { + #[slhx::handler] + fn launch_work(_form: slhx::Form) -> impl IntoEffect { + ui::control_center::slots::notice.text("queued") + } + + let batch = inspect(launch_work( + ui::control_center::forms::launch_work.typed::(), + )); + + assert!(batch.has_slot(ui::control_center::slots::notice)); + assert!(matches!(batch.ops(), [Effect::Put { payload: Payload::Text(_), .. }])); + } + // req: examples/001 req: form/002 req: codegen/003 #[test] fn techdemo_exports_form_and_interaction_handles() { diff --git a/slhx-build/src/lib.rs b/slhx-build/src/lib.rs index 79676e5..e4832c5 100644 --- a/slhx-build/src/lib.rs +++ b/slhx-build/src/lib.rs @@ -276,6 +276,10 @@ impl Resources { component: String, controls: Vec, ) -> io::Result<()> { + let controls = controls + .into_iter() + .filter(|control| control.name != "__h") + .collect(); let resource = make_resource("form", symbol, name, component, false)?; match self.forms.get(&resource.ident) { Some(existing) if existing.resource.symbol != resource.symbol => Err(io::Error::new( @@ -1062,6 +1066,7 @@ mod tests { std::fs::write( templates.join("profile.heml"), r#"
+ @@ -1090,6 +1095,7 @@ mod tests { let syms = std::fs::read_to_string(out.join("slhx.syms")).unwrap(); assert!(syms.contains("handle_form\tsave\tprofile\n")); + assert!(!syms.contains("form_field\tprofile\t__h\t")); assert!(syms.contains("form_field\tprofile\ttitle\ttrue\tfalse\n")); assert!(syms.contains("form_field\tprofile\tlabels\tfalse\ttrue\n"));