generateRepositoryImplTemplate method

String generateRepositoryImplTemplate(
  1. ApiGenerationConfig config
)

Generates repository implementation template.

Creates the repository implementation with proper error handling and data transformation.

Parameters:

  • config: API generation configuration

Implementation

String generateRepositoryImplTemplate(ApiGenerationConfig config) {
  final bodyClass =
      typeResolver.resolveBodyClass(config.apiClassName, config.bodyList);
  final entityClass = typeResolver.resolveEntityClass(config);
  final entityImpl = typeResolver.generateEntityReturn(config);

  final methodOfDataRepository = '''@override
${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''${typeResolver.resolveFlutterClassOfMethod(config.method)}<Either<MorphemeFailure, $entityClass>> ${config.apiMethodName}($bodyClass body,{Map<String, String>? headers,}) async* {
  try {
    final response = remoteDataSource.${config.apiMethodName}(
      body,
      headers: headers,
    );
    await for (final data in response) {
      yield Right($entityImpl);
    }
  } on MorphemeException catch (e) {
    yield Left(e.toMorphemeFailure());
  } catch (e) {
    yield Left(InternalFailure(e.toString()));
  }
}''';
    },
    onFuture: () {
      return '''${typeResolver.resolveFlutterClassOfMethod(config.method)}<Either<MorphemeFailure, $entityClass>> ${config.apiMethodName}($bodyClass body,{Map<String, String>? headers, ${typeResolver.isApplyCacheStrategy(config.method) ? 'CacheStrategy? cacheStrategy,' : ''}}) async {
  try {
    final data = await remoteDataSource.${config.apiMethodName}(body, headers: headers, ${typeResolver.isApplyCacheStrategy(config.method) ? 'cacheStrategy: cacheStrategy,' : ''});
    return Right($entityImpl);
  } on MorphemeException catch (e) {
    return Left(e.toMorphemeFailure());
  } catch (e) {
    return Left(InternalFailure(e.toString()));
  }
}''';
    },
  )}''';

  return '''${config.returnData == 'body_bytes' ? "import 'dart:typed_data';" : ''}

import 'package:core/core.dart';

${config.isReturnDataModel ? '''import '../../domain/entities/${config.apiName}_entity.dart';''' : ''}
${config.isReturnDataModel ? '''import '../../mapper.dart';''' : ''}
import '../../domain/repositories/${config.pageName}_repository.dart';
import '../datasources/${config.pageName}_remote_data_source.dart';
import '../models/body/${config.apiName}_body.dart';

class ${config.pageClassName}RepositoryImpl implements ${config.pageClassName}Repository {
${config.pageClassName}RepositoryImpl({
  required this.remoteDataSource,
});

final ${config.pageClassName}RemoteDataSource remoteDataSource;

$methodOfDataRepository
}''';
}