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
+9 -5
View File
@@ -173,7 +173,7 @@ fn registry(state: Arc<AppState>) -> impl DispatchRegistry {
move |form| {
// req: examples/001 req: list/003
let mut board = state.board.lock().unwrap();
let moved = update_card(&mut board, form.value("card_id"), |card| {
let moved = update_card(&mut board, form.parse("card_id"), |card| {
card.column = card.column.saturating_sub(1);
});
board_effects(&board, if moved { "Card moved left" } else { "Card not found" })
@@ -184,7 +184,7 @@ fn registry(state: Arc<AppState>) -> impl DispatchRegistry {
move |form| {
// req: examples/001 req: list/003
let mut board = state.board.lock().unwrap();
let moved = update_card(&mut board, form.value("card_id"), |card| {
let moved = update_card(&mut board, form.parse("card_id"), |card| {
card.column = (card.column + 1).min(COLUMNS.len() - 1);
});
board_effects(&board, if moved { "Card moved right" } else { "Card not found" })
@@ -196,7 +196,7 @@ fn registry(state: Arc<AppState>) -> impl DispatchRegistry {
// req: examples/001 req: list/003
let mut board = state.board.lock().unwrap();
let before = board.cards.len();
if let Some(id) = form.value("card_id").and_then(|id| id.parse::<u64>().ok()) {
if let Some(id) = form.parse::<u64>("card_id") {
board.cards.retain(|card| card.id != id);
}
board_effects(&board, if board.cards.len() < before { "Card deleted" } else { "Card not found" })
@@ -212,8 +212,12 @@ fn board_effects(board: &BoardState, notice: &'static str) -> impl IntoEffect {
)
}
fn update_card(board: &mut BoardState, card_id: Option<&str>, update: impl FnOnce(&mut Card)) -> bool {
let Some(id) = card_id.and_then(|id| id.parse::<u64>().ok()) else {
fn update_card(
board: &mut BoardState,
card_id: Option<u64>,
update: impl FnOnce(&mut Card),
) -> bool {
let Some(id) = card_id else {
return false;
};
let Some(card) = board.cards.iter_mut().find(|card| card.id == id) else {