executeRules method

Future<RulesResult> executeRules(
  1. Map<String, dynamic> context
)

Executes rules with raw context (for custom events)

Implementation

Future<RulesResult> executeRules(Map<String, dynamic> context) async {
  try {
    // Extract rule definition from context with safe casting
    final ruleDefinitionRaw = context['ruleDefinition'];
    final ruleDefinition =
        ruleDefinitionRaw is Map<String, dynamic> ? ruleDefinitionRaw : null;

    if (ruleDefinitionRaw != null && ruleDefinition == null) {
      ObslyLogger.warn(
          'ruleDefinition is not a Map<String, dynamic>: ${ruleDefinitionRaw.runtimeType} = $ruleDefinitionRaw');
    }

    if (ruleDefinition != null) {
      // Transform rule definition to engine format (same as test)
      final transformedRule = _transformRuleDefinition(ruleDefinition);

      // Extract event context (separate from rule definition)
      final eventContext = Map<String, dynamic>.from(context);
      eventContext.remove('ruleDefinition'); // Remove rule from context

      // Use DartRulesEngine executeRules method (same as successful test)
      final engineResult = await _dartEngine.executeRules(
        ruleDefinition: transformedRule,
        eventContext: eventContext,
      );

      // Convert engine result to RulesResult, preserving raw result
      // DartRulesEngine always returns Map<String, dynamic>
      try {
        final cleanEngineResult = Map<String, dynamic>.from(engineResult);
        return RulesResult.fromMap(cleanEngineResult,
            rawResult: engineResult);
      } catch (conversionError, conversionStackTrace) {
        ObslyLogger.error(
            'Error converting engine result to RulesResult: $conversionError');
        ObslyLogger.error('Conversion stack trace: $conversionStackTrace');
        ObslyLogger.error('Raw engine result: $engineResult');
        rethrow; // Preserve original stack trace
      }
    } else {
      // No rule definition provided, return empty result
      return const RulesResult.empty();
    }
  } catch (e, stackTrace) {
    ObslyLogger.error('Rules engine execution error: $e');
    ObslyLogger.error('Stack trace: $stackTrace');
    return RulesResult.error(
        'Rules execution failed: $e\nStack trace: $stackTrace');
  }
}