Skip to main content

a2ui_base/components/
button.rs

1//! Button component behavior — framework-agnostic `handle_event`.
2
3use std::collections::HashMap;
4
5use crate::event::{EventResult, InputEvent, InputKey};
6use crate::model::component_context::ComponentContext;
7use crate::protocol::common_types::{Action, DynamicValue};
8
9/// Handle a key-press for a Button (fires its `action` on Enter).
10pub fn handle_event(ctx: &ComponentContext, event: &InputEvent) -> Option<EventResult> {
11    let InputEvent::KeyPress { key } = event;
12    if *key != InputKey::Enter {
13        return None;
14    }
15
16    let comp_model = ctx.components.get(&ctx.component_id)?;
17    let action = comp_model.action()?;
18
19    match action {
20        Action::Event { event: action_event } => {
21            let mut context = HashMap::new();
22            for (k, dv) in &action_event.context {
23                context.insert(k.clone(), ctx.data_context.resolve_dynamic_value(&dv));
24            }
25            Some(EventResult::Action {
26                event_name: action_event.name.clone(),
27                context,
28                want_response: action_event.want_response,
29                response_path: action_event.response_path.clone(),
30            })
31        }
32        Action::FunctionCall { function_call: fc } => {
33            // Execute local function call.
34            let _result = ctx
35                .data_context
36                .resolve_dynamic_value(&DynamicValue::Function(fc));
37            Some(EventResult::Consumed)
38        }
39    }
40}