parseAction method

DynamicAction parseAction(
  1. Map<String, dynamic>? map
)

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');
  }
}