diff --git a/examples/v0/src/lib.rs b/examples/v0/src/lib.rs index 51cb967..a049eaa 100644 --- a/examples/v0/src/lib.rs +++ b/examples/v0/src/lib.rs @@ -15,6 +15,7 @@ mod tests { } #[derive(Clone, Debug)] + #[slhx::form("new_todo")] struct TodoInput { title: String, } @@ -55,6 +56,20 @@ mod tests { assert!(matches!(effect.ops(), [Effect::Put { .. }])); } + // req: examples/001 req: form/001 req: form/004 req: form/006 req: derive_handler/003 + #[test] + fn form_handler_is_checked_against_hemplate_form() { + #[slhx::handler] + fn add_todo(_form: slhx::Form) -> impl IntoEffect { + ui::slots::todo_list.text("queued") + } + + let effect = inspect(add_todo(ui::forms::new_todo.typed::())); + + assert!(effect.has_slot(ui::slots::todo_list)); + assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Text(_), .. }])); + } + // req: examples/001 req: progressive_disclosure/001 req: build/001 req: build/005 req: codegen/002 #[test] fn todos_append_keyed_rows_from_form_input() { diff --git a/slhx-core/src/lib.rs b/slhx-core/src/lib.rs index 7fac023..e37f983 100644 --- a/slhx-core/src/lib.rs +++ b/slhx-core/src/lib.rs @@ -881,6 +881,13 @@ impl Form { self.id } + pub const fn typed(self) -> Form { + Form { + id: self.id, + _marker: PhantomData, + } + } + pub fn field(self, name: impl Into) -> ResourceRef { ResourceRef::scoped(self.id, ScopeKey::Field(name.into())) }