generateRepository method

RepositoryGenerateResult generateRepository(
  1. String className,
  2. Map<String, dynamic> paths,
  3. Map<String, dynamic> components
)

Implementation

RepositoryGenerateResult generateRepository(
  String className,
  Map<String, dynamic> paths,
  Map<String, dynamic> components,
) {
  final buffer = StringBuffer();

  final schemas = components['schemas'] ?? {};

  bool needsFile = false;

  final Set<String> collectedEntities = {};

  final List<String> methodSignatures = [];
  final List<String> returnTypes = [];

  paths.forEach((path, methods) {
    methods.forEach((method, details) {
      // return type
      final result = repositoryReturnTypeResult(details, schemas, );
      collectedEntities.addAll(result.entities);
      returnTypes.add(result.type);

      // parameters
      final paramResult = generateParameters(details, components);
      collectedEntities.addAll(paramResult.usedEntities);
      methodSignatures.add(paramResult.params);

      // file usage
      if (useFile(details, components, collectedEntities)) {
        needsFile = true;
      }
    });
  });

  final Set<String> actuallyUsedEntities = {};

  for (final entity in collectedEntities) {
    final regex = RegExp(r'\b' + entity + r'\b');

    final usedInParams = methodSignatures.any((sig) => regex.hasMatch(sig));
    final usedInReturn = returnTypes.any((ret) => regex.hasMatch(ret));

    if (usedInParams || usedInReturn) {
      actuallyUsedEntities.add(entity);
    }
  }

  if (needsFile) {
    buffer.writeln("import 'dart:io';");
  }

  buffer.writeln(dartzImport(actuallyUsedEntities));
  buffer.writeln("import 'package:$projectName/core/error/failure.dart';");

  final featureFolder = className.snakeCase;

  for (final entity in actuallyUsedEntities) {
    buffer.writeln(
      "import 'package:$projectName/features/$featureFolder/domain/entities/${entity.snakeCase}.dart';",
    );
  }

  buffer.writeln();
  buffer.writeln('abstract class ${className}Repository {');

  paths.forEach((path, methods) {
    methods.forEach((method, details) {
      final funcName = generateMethodName(
        method,
        path,
        details['operationId'],
      );

      final result = repositoryReturnTypeResult(details, schemas);
      final paramResult = generateParameters(details, components);

      buffer.writeln(
        '  Future<Either<Failure, ${result.type}>> '
        '$funcName(${paramResult.params});',
      );
    });
  });

  buffer.writeln('}');

  return RepositoryGenerateResult(buffer.toString(), actuallyUsedEntities);
}