import 'package:swagger_generator_flutter/commands/services/service_typedefs.dart'; import 'package:swagger_generator_flutter/core/models.dart'; import 'package:swagger_generator_flutter/pipeline/parse/impl/swagger_data_parser.dart'; class DocumentMergeService { DocumentMergeService({SwaggerDataParser? parser}) : _parser = parser ?? SwaggerDataParser(); final SwaggerDataParser _parser; Future fetchAndMerge( List urls, { LogCallback? progress, }) async { SwaggerDocument? mergedDocument; for (var i = 0; i < urls.length; i++) { final url = urls[i]; progress?.call(' [${i + 1}/${urls.length}] 正在解析: $url'); final doc = await _parser.fetchAndParseSwaggerDocument(url); progress?.call( ' 解析完成: ${doc.models.length} 个模型, ${doc.paths.length} 个路径', ); if (mergedDocument == null) { mergedDocument = doc; progress?.call(' 初始文档: ${doc.models.length} 个模型'); continue; } final beforeModelCount = mergedDocument.models.length; final currentModelCount = doc.models.length; final overlappingModels = []; for (final key in doc.models.keys) { if (mergedDocument.models.containsKey(key)) { overlappingModels.add(key); } } if (overlappingModels.isNotEmpty) { progress?.call( ' 发现 ${overlappingModels.length} 个同名模型将被覆盖: ' '${overlappingModels.take(5).join(", ")}' '${overlappingModels.length > 5 ? "..." : ""}', ); } mergedDocument = SwaggerDocument( title: mergedDocument.title, description: mergedDocument.description, version: '${mergedDocument.version} + ${doc.version}', paths: {...mergedDocument.paths, ...doc.paths}, models: {...mergedDocument.models, ...doc.models}, controllers: {...mergedDocument.controllers, ...doc.controllers}, ); final afterModelCount = mergedDocument.models.length; progress?.call( ' 合并后: $beforeModelCount + $currentModelCount ' '-> $afterModelCount 个模型', ); if (overlappingModels.isNotEmpty) { progress?.call( ' 同名模型列表: ' '${overlappingModels.take(10).join(", ")}' '${overlappingModels.length > 10 ? "..." : ""}', ); } } return mergedDocument; } }