GenerateMermaidDiagramCommand.cs 2.4 KB

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