extractRequestParams function

List<String> extractRequestParams(
  1. Map<String, dynamic> details,
  2. Map<String, dynamic> componentsSchemas,
  3. Set<String> imports, [
  4. Set<String>? usedModels,
])

Implementation

List<String> extractRequestParams(
  Map<String, dynamic> details,
  Map<String, dynamic> componentsSchemas,
  Set<String> imports, [
  Set<String>? usedModels,
]) {
  final bodyParams = <String>[];
  usedModels ??= <String>{};

  final requestBody = details['requestBody'];
  if (requestBody == null) return bodyParams;

  final content = asStringMap(requestBody['content']);
  if (content == null) return bodyParams;

  // =========================
  // 🔥 MULTIPART / FORM-DATA
  // =========================
  final multipart = asStringMap(content['multipart/form-data']);
  if (multipart != null) {
    final schema = asStringMap(multipart['schema']);
    final properties = asStringMap(schema?['properties']) ?? {};

    for (final entry in properties.entries) {
      final name = entry.key;
      final prop = asStringMap(entry.value);

      if (prop?['format'] == 'binary') {
        // FILE PARAM
        imports.add('dart:io');
        bodyParams.add('File $name');
      } else {
        final type = mapType(prop);
        bodyParams.add('$type $name');
      }
    }

    return bodyParams;
  }

  // =========================
  // 🟢 APPLICATION / JSON
  // =========================
  final appJson = asStringMap(content['application/json']);
  final schema = asStringMap(appJson?['schema']);
  if (schema == null) return bodyParams;

  if (schema['\$ref'] != null) {
    final refName = schema['\$ref'].split('/').last;
    final refSchema = asStringMap(componentsSchemas[refName]);

    if (refSchema != null &&
        isPrimitiveOnlySchema(refSchema, componentsSchemas)) {
      final properties = asStringMap(refSchema['properties']) ?? {};
      final required = (refSchema['required'] as List?)?.cast<String>() ?? [];

      properties.forEach((name, propSchema) {
        final prop = asStringMap(propSchema);
        final isRequired = required.contains(name);
        final type = mapType(prop);
        bodyParams.add('${isRequired ? type : '$type?'} $name');
      });

      return bodyParams;
    }

    imports.add(refName);
    usedModels.add(refName);
    bodyParams.add('$refName ${refName.toString().camelCase}');
    return bodyParams;
  }

  return bodyParams;
}