parseAction method
Parse a JSON map (e.g. from data.onClick) into a DynamicAction.
Throws if map is null or missing "type".
Implementation
DynamicAction parseAction(Map<String, dynamic>? map) {
if (map == null) {
throw ActionEngineException('Action map must not be null');
}
final type = map['type'] as String?;
if (type == null || type.isEmpty) {
throw ActionEngineException('Action must have a string "type"');
}
switch (type) {
case 'navigate':
final route = map['route'] as String? ?? '';
final args = map['arguments'] as Map<String, dynamic>?;
return DynamicAction.navigate(route: route, arguments: args != null ? Map.from(args) : null);
case 'api_call':
final url = map['url'] as String? ?? '';
final methodStr = (map['method'] as String?)?.toUpperCase() ?? 'GET';
final method = _parseMethod(methodStr);
final headers = map['headers'] as Map<String, dynamic>?;
final headersMap = headers != null
? headers.map((k, v) => MapEntry(k.toString(), v?.toString() ?? ''))
: null;
final body = map['body'];
final bindTo = map['bindTo'] as String?;
return DynamicAction.apiCall(
url: url,
method: method,
headers: headersMap,
body: body,
bindTo: bindTo,
);
case 'action_group':
final execution = (map['execution'] as String?)?.toLowerCase() ?? 'sequential';
final mode = execution == 'parallel'
? ActionExecutionMode.parallel
: ActionExecutionMode.sequential;
final actionsRaw = map['actions'] as List<dynamic>? ?? [];
final actions = actionsRaw
.map((e) => e is Map<String, dynamic> ? parseAction(e) : null)
.whereType<DynamicAction>()
.toList();
return DynamicAction.actionGroup(executionMode: mode, actions: actions);
default:
throw ActionEngineException('Unknown action type: $type');
}
}