Files
hemx/examples/techdemo/src/lib.rs
T
slhx agent a138f92b33 feat(build): generate slot target objects
Add generated targets::<slot> wrapper objects so partial swaps read as target.put/append/replace while preserving existing lower-aware commands and IntoEffect wiring.

req: dx/006

req: codegen/001

req: codegen/002

req: component/003
2026-06-02 07:21:23 +02:00

77 lines
2.3 KiB
Rust

#[slhx::surface]
pub mod ui {}
#[cfg(test)]
mod tests {
use super::ui::control_center::{forms, handles, slots, targets};
use super::ui::issue_card::handles as card_handles;
use super::ui::issue_lane::events as lane_events;
use hemplate::Hemplate;
use slhx::{Effect, IntoEffect, Payload};
use slhx_test::inspect;
#[derive(Hemplate)]
#[hemplate = "partials"]
struct FastMetric {
label: &'static str,
}
#[allow(dead_code)]
#[derive(Clone, Debug)]
#[slhx::form("launch_work")]
struct LaunchWork {
title: String,
lane: String,
impact: Option<u8>,
}
// req: examples/001 req: codegen/002 req: public_api/001
#[test]
fn techdemo_uses_generated_slots_for_multi_target_updates() {
fn update() -> impl IntoEffect {
(
targets::hero_metrics.put(&FastMetric { label: "fast" }),
slots::notice.text("typed"),
)
}
let batch = inspect(update());
assert!(batch.has_slot(slots::hero_metrics));
assert!(batch.has_slot(slots::notice));
}
// 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<LaunchWork>) -> impl IntoEffect {
slots::notice.text("queued")
}
let batch = inspect(launch_work(LaunchWork::FORM));
assert!(batch.has_slot(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() {
assert_ne!(handles::launch_work.id(), card_handles::advance_work.id());
assert_eq!(
forms::launch_work.field("title").resource,
forms::launch_work.id()
);
}
// req: codegen/006
#[test]
fn techdemo_exports_generated_event_constants() {
assert_eq!(lane_events::drop.as_str(), "drop");
assert!(matches!(
slhx::event(lane_events::drop, "card-1"),
Effect::Emit { name, payload } if name == "drop" && payload == "card-1"
));
}
}