GenerateMermaidDiagramCommand.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using Microsoft.Extensions.DependencyInjection;
  2. using RackPeek.Domain.UseCases.Mermaid;
  3. using Spectre.Console;
  4. using Spectre.Console.Cli;
  5. namespace Shared.Rcl.Commands.Exporters;
  6. public sealed class GenerateMermaidDiagramCommand(IServiceProvider provider)
  7. : AsyncCommand<GenerateMermaidDiagramSettings>
  8. {
  9. public override async Task<int> ExecuteAsync(
  10. CommandContext context,
  11. GenerateMermaidDiagramSettings settings,
  12. CancellationToken cancellationToken)
  13. {
  14. using IServiceScope scope = provider.CreateScope();
  15. MermaidDiagramExportUseCase useCase = scope.ServiceProvider
  16. .GetRequiredService<MermaidDiagramExportUseCase>();
  17. var options = new MermaidExportOptions
  18. {
  19. IncludeTags = ParseCsv(settings.IncludeTags),
  20. DiagramType = settings.DiagramType ?? "flowchart TD",
  21. IncludeLabels = !settings.NoLabels,
  22. IncludeEdges = !settings.NoEdges,
  23. LabelWhitelist = ParseCsv(settings.LabelWhitelist)
  24. };
  25. MermaidExportResult? result = await useCase.ExecuteAsync(options);
  26. if (result is null)
  27. {
  28. AnsiConsole.MarkupLine("[red]Mermaid export returned null.[/]");
  29. return -1;
  30. }
  31. if (result.Warnings.Any())
  32. {
  33. AnsiConsole.MarkupLine("[yellow]Warnings:[/]");
  34. foreach (var warning in result.Warnings)
  35. AnsiConsole.MarkupLine($"[yellow]- {Markup.Escape(warning)}[/]");
  36. AnsiConsole.WriteLine();
  37. }
  38. if (!string.IsNullOrWhiteSpace(settings.OutputPath))
  39. {
  40. await File.WriteAllTextAsync(
  41. settings.OutputPath,
  42. result.DiagramText,
  43. cancellationToken);
  44. AnsiConsole.MarkupLine(
  45. $"[green]Mermaid diagram written to:[/] {Markup.Escape(settings.OutputPath)}");
  46. }
  47. else
  48. {
  49. AnsiConsole.MarkupLine("[green]Generated Mermaid Diagram:[/]");
  50. AnsiConsole.WriteLine();
  51. AnsiConsole.Write(result.DiagramText);
  52. }
  53. return 0;
  54. }
  55. private static IReadOnlyList<string> ParseCsv(string? raw)
  56. {
  57. if (string.IsNullOrWhiteSpace(raw))
  58. return Array.Empty<string>();
  59. return raw.Split(',', StringSplitOptions.RemoveEmptyEntries)
  60. .Select(x => x.Trim())
  61. .Where(x => !string.IsNullOrWhiteSpace(x))
  62. .ToArray();
  63. }
  64. }