import 'dart:io'; import 'package:args/args.dart'; import 'package:koi_swagger_parser/koi_swagger_parser.dart'; Future main(List arguments) async { final parser = ArgParser() ..addFlag('help', abbr: 'h', negatable: false, help: '显示帮助信息。'); final generateParser = ArgParser() ..addFlag('all', abbr: 'a', negatable: false, help: '兼容旧命令格式,当前等价于生成全部资源。') ..addOption('config', abbr: 'c', help: '配置文件路径。') ..addOption('cwd', help: '工作目录。') ..addFlag('dry-run', negatable: false, help: '只解析与渲染,不落盘。') ..addFlag('verbose', abbr: 'v', negatable: false, help: '打印更多诊断信息。'); parser.addCommand('generate', generateParser); late final ArgResults result; try { result = parser.parse(arguments); } on FormatException catch (error) { stderr.writeln(error.message); stderr.writeln(parser.usage); exitCode = 64; return; } if ((result['help'] as bool?) ?? false) { stdout.writeln(_usage(parser)); return; } final command = result.command; if (command == null || command.name == 'generate') { final commandArgs = command ?? result; await _runGenerate(commandArgs, parser); return; } stdout.writeln(_usage(parser)); } Future _runGenerate(ArgResults result, ArgParser parser) async { final generator = const KoiSwaggerParser(); try { final summary = await generator.generate( configPath: result['config'] as String?, workingDirectory: result['cwd'] as String?, dryRun: result['dry-run'] as bool? ?? false, verbose: result['verbose'] as bool? ?? false, ); final mode = summary.dryRun ? 'dry-run' : 'written'; stdout.writeln( '[koi_swagger_parser] $mode ${summary.writtenFiles.length} file(s), ' '${summary.operationsCount} operation(s), ' '${summary.modelsCount} model(s).', ); } on Object catch (error, stackTrace) { stderr.writeln('[koi_swagger_parser] generation failed: $error'); if ((result['verbose'] as bool?) ?? false) { stderr.writeln(stackTrace); } else { stderr.writeln('使用 --verbose 可以查看详细堆栈。'); } stderr.writeln(parser.usage); exitCode = 1; } } String _usage(ArgParser parser) { return [ 'koi_swagger_parser', '', '用法:', ' dart run koi_swagger_parser generate --all', '', parser.usage, ].join('\n'); }