feat(axum): parse typed interaction values

Add InteractionForm::parse for common typed field extraction and use it in example interaction handlers to avoid repeated string parsing plumbing.

req: form/004

req: dx/003

req: examples/003
This commit is contained in:
slhx agent
2026-06-02 00:31:32 +02:00
parent a462e7f097
commit 1e53a6f7df
4 changed files with 33 additions and 11 deletions
+6 -6
View File
@@ -291,7 +291,7 @@ fn registry(shared: Arc<Shared>) -> impl DispatchRegistry {
let mut demo = shared.demo.lock().unwrap();
let title = form.value("title").unwrap_or("").trim();
let lane = parse_lane(form.value("lane"));
let impact = form.value("impact").and_then(|value| value.parse::<u8>().ok()).unwrap_or(5).clamp(1, 9);
let impact = form.parse::<u8>("impact").unwrap_or(5).clamp(1, 9);
if !title.is_empty() {
let id = demo.next_id;
demo.next_id += 1;
@@ -308,7 +308,7 @@ fn registry(shared: Arc<Shared>) -> impl DispatchRegistry {
move |form| {
// req: list/003 req: examples/001
let mut demo = shared.demo.lock().unwrap();
let title = update_work(&mut demo, form.value("work_id"), |item| {
let title = update_work(&mut demo, form.parse("work_id"), |item| {
item.stage = item.stage.advance();
if item.stage == Stage::Shipped {
item.lane = LANES.len() - 1;
@@ -327,7 +327,7 @@ fn registry(shared: Arc<Shared>) -> impl DispatchRegistry {
// req: list/003 req: examples/001
let mut demo = shared.demo.lock().unwrap();
let lane = parse_lane(form.value("lane"));
let title = update_work(&mut demo, form.value("work_id"), |item| {
let title = update_work(&mut demo, form.parse("work_id"), |item| {
item.lane = lane;
item.stage = match lane {
0 => Stage::Draft,
@@ -336,7 +336,7 @@ fn registry(shared: Arc<Shared>) -> impl DispatchRegistry {
};
});
if let Some(title) = title {
demo.selected_id = form.value("work_id").and_then(|value| value.parse().ok());
demo.selected_id = form.parse("work_id");
demo.spotlight = format!("{title} moved to {} by drag-and-drop; Rust re-rendered the board slot.", LANES[lane].1);
demo.log(format!("Dragged {title} to {}", LANES[lane].1));
}
@@ -348,7 +348,7 @@ fn registry(shared: Arc<Shared>) -> impl DispatchRegistry {
move |form| {
// req: list/003 req: examples/001
let mut demo = shared.demo.lock().unwrap();
if let Some(id) = form.value("work_id").and_then(|value| value.parse::<u64>().ok()) {
if let Some(id) = form.parse::<u64>("work_id") {
let before = demo.work.len();
demo.work.retain(|item| item.id != id);
if demo.work.len() < before {
@@ -367,7 +367,7 @@ fn registry(shared: Arc<Shared>) -> impl DispatchRegistry {
move |form| {
// req: examples/001
let mut demo = shared.demo.lock().unwrap();
if let Some(id) = form.value("work_id").and_then(|value| value.parse::<u64>().ok()) {
if let Some(id) = form.parse::<u64>("work_id") {
if let Some(item) = demo.work.iter().find(|item| item.id == id).cloned() {
demo.selected_id = Some(id);
demo.spotlight = format!("{} · lane={} · stage={} · impact={}", item.title, LANES[item.lane].1, item.stage.label(), item.impact);