swagger_generator_flutter/lib/commands/services/document_merge_service.dart

77 lines
2.4 KiB
Dart

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<SwaggerDocument?> fetchAndMerge(
List<String> 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 = <String>[];
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;
}
}