77 lines
2.4 KiB
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/parsers/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;
|
|
}
|
|
}
|