diff --git a/example/pubspec.lock b/example/pubspec.lock index cbf585c..247db8e 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -558,7 +558,7 @@ packages: path: ".." relative: true source: path - version: "3.1.0" + version: "3.1.4" term_glyph: dependency: transitive description: diff --git a/lib/core/config.dart b/lib/core/config.dart index a5b3994..fb5906e 100644 --- a/lib/core/config.dart +++ b/lib/core/config.dart @@ -54,6 +54,10 @@ class SwaggerConfig { static Map>? get enumKeyMappings => ConfigRepository.loadSync().enumKeyMappings; + /// 获取 JsonSerializable 配置(从配置文件读取) + static JsonSerializableConfig? get jsonSerializableConfig => + ConfigRepository.loadSync().jsonSerializableConfig; + /// 默认文档文件名 static const String defaultDocumentationFile = 'generated_api_documentation.md'; diff --git a/lib/core/config_repository.dart b/lib/core/config_repository.dart index dcaabb2..c1d6a2a 100644 --- a/lib/core/config_repository.dart +++ b/lib/core/config_repository.dart @@ -17,6 +17,28 @@ class EnumKeyMapping { final String? description; } +/// JSON Serializable 配置 +class JsonSerializableConfig { + const JsonSerializableConfig({ + this.checked = false, + this.explicitToJson = false, + this.includeIfNull = true, + }); + + final bool checked; + final bool explicitToJson; + final bool includeIfNull; + + static JsonSerializableConfig? fromMap(Map? map) { + if (map == null) return null; + return JsonSerializableConfig( + checked: map['checked'] as bool? ?? false, + explicitToJson: map['explicit_to_json'] as bool? ?? false, + includeIfNull: map['include_if_null'] as bool? ?? true, + ); + } +} + /// 配置仓库 /// 负责加载和提供配置信息 class ConfigRepository { @@ -292,6 +314,15 @@ class ConfigRepository { return api?['base_page_result_import'] as String? ?? ''; } + /// 获取 JsonSerializable 配置 + JsonSerializableConfig? get jsonSerializableConfig { + final generation = _config['generation'] as Map?; + final models = generation?['models'] as Map?; + final jsonSerializable = + models?['json_serializable'] as Map?; + return JsonSerializableConfig.fromMap(jsonSerializable); + } + /// 获取枚举键名映射配置 /// 返回格式: { "EnumName": { value: { "name": "KEY_NAME", "description": "描述" } } } Map>? get enumKeyMappings { diff --git a/lib/pipeline/generate/impl/model/model_content_builders.dart b/lib/pipeline/generate/impl/model/model_content_builders.dart index ce4d91c..22c8796 100644 --- a/lib/pipeline/generate/impl/model/model_content_builders.dart +++ b/lib/pipeline/generate/impl/model/model_content_builders.dart @@ -127,6 +127,18 @@ String _generateAnnotatedModelCodeWithoutImports( buffer.writeln(StringHelper.generateComment(model.description)); } + final jsonConfig = SwaggerConfig.jsonSerializableConfig; + if (jsonConfig != null) { + final params = []; + if (jsonConfig.checked) params.add('checked: true'); + if (jsonConfig.explicitToJson) params.add('explicitToJson: true'); + if (!jsonConfig.includeIfNull) params.add('includeIfNull: false'); + + if (params.isNotEmpty) { + buffer.writeln('@JsonSerializable(${params.join(', ')})'); + } + } + buffer ..writeln('@freezed') ..writeln('abstract class $className with _\$$className {') diff --git a/lib/pipeline/generate/impl/model/model_file_writers.dart b/lib/pipeline/generate/impl/model/model_file_writers.dart index 10759e9..9062e2b 100644 --- a/lib/pipeline/generate/impl/model/model_file_writers.dart +++ b/lib/pipeline/generate/impl/model/model_file_writers.dart @@ -44,19 +44,17 @@ String buildSingleModelFile( ..writeln(); if (!model.isEnum) { - buffer - ..writeln( - "import 'package:freezed_annotation/freezed_annotation.dart';", - ) - ..writeln(); - } else { - buffer - ..writeln( - "import 'package:json_annotation/json_annotation.dart';", - ) - ..writeln(); + buffer.writeln( + "import 'package:freezed_annotation/freezed_annotation.dart';", + ); } + buffer + ..writeln( + "import 'package:json_annotation/json_annotation.dart';", + ) + ..writeln(); + final importedTypes = generator.getImportedTypes(model); if (importedTypes.isNotEmpty) { buffer