generateRepositoryImplTemplate method
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
}''';
}