getEventCallArgs function

String getEventCallArgs(
  1. String? fpath,
  2. String? method
)

Extracts and formats the parameters for calling an API method within a BLoC event handler.

It parses the method's parameters and returns a string of formatted arguments (e.g., id, name: event.name) to be used in the generated code.

Implementation

String getEventCallArgs(String? fpath, String? method) {
  if (fpath == null || method == null) return '';

  String? paramsJson;
  try {
    paramsJson = extractMethodParams(fpath, method);
    // printInfo(paramsJson);
  } catch (e) {
    // printWarning(e);
    // paramsJson = extractMethodInvocationArgs(fpath, method);
    // printInfo(paramsJson);
  }
  if (paramsJson == null) return '';

  final paramsString = jsonDecode(paramsJson)?["data"] as String?;
  if (paramsString == null || paramsString == '()') return '';

  // remove parentheses `()` to get the content, e.g.:
  // "String id, { OrderDomainApplyCouponDTO? applyCouponDTO, }"
  var innerParams = paramsString.substring(1, paramsString.length - 1).trim();
  if (innerParams.isEmpty) return '';

  List<String> positionalParams = [];
  List<String> namedParams = [];

  final namedParamsStartIndex = innerParams.indexOf('{');
  String positionalPartStr;
  String namedPartStr = '';

  if (namedParamsStartIndex != -1) {
    // Case with mixed or only named parameters
    positionalPartStr = innerParams.substring(0, namedParamsStartIndex).trim();
    final namedParamsEndIndex = innerParams.lastIndexOf('}');
    if (namedParamsEndIndex != -1) {
      namedPartStr = innerParams
          .substring(namedParamsStartIndex + 1, namedParamsEndIndex)
          .trim();
    }
  } else {
    // Case with only positional (required or optional) parameters
    positionalPartStr = innerParams.replaceAll(RegExp(r'[\[\]]'), '').trim();
  }

  // Process positional parameters
  if (positionalPartStr.endsWith(',')) {
    positionalPartStr = positionalPartStr.substring(
      0,
      positionalPartStr.length - 1,
    );
  }
  if (positionalPartStr.isNotEmpty) {
    positionalParams = positionalPartStr
        .split(',')
        .where((s) => s.trim().isNotEmpty)
        .map((p) {
          final namePart = p.trim().split('=').first.trim();
          final name = namePart.split(' ').last;
          return 'event.$name';
        })
        .toList();
  }

  // Process named parameters
  if (namedPartStr.endsWith(',')) {
    namedPartStr = namedPartStr.substring(0, namedPartStr.length - 1);
  }
  if (namedPartStr.isNotEmpty) {
    namedParams = namedPartStr.split(',').where((s) => s.trim().isNotEmpty).map(
      (p) {
        final namePart = p.trim().split('=').first.trim();
        final name = namePart.split(' ').last;
        return '$name: event.$name';
      },
    ).toList();
  }

  // Combine and return
  final allParams = [...positionalParams, ...namedParams];
  return allParams.join(', ');
}