James 4 недель назад
Родитель
Сommit
7afea44739

+ 4 - 8
RackPeek.Domain/UseCases/Mermaid/MermaidDiagramExportUseCase.cs

@@ -3,19 +3,15 @@ using System.Threading.Tasks;
 using RackPeek.Domain.Resources;
 using RackPeek.Domain.Persistence;
 
-namespace RackPeek.Domain.UseCases.Mermaid
-{
-    public class MermaidDiagramExportUseCase : IUseCase
-    {
+namespace RackPeek.Domain.UseCases.Mermaid {
+    public class MermaidDiagramExportUseCase : IUseCase {
         private readonly IResourceCollection _repository;
 
-        public MermaidDiagramExportUseCase(IResourceCollection repository)
-        {
+        public MermaidDiagramExportUseCase(IResourceCollection repository) {
             _repository = repository;
         }
 
-        public async Task<MermaidExportResult?> ExecuteAsync(MermaidExportOptions options)
-        {
+        public async Task<MermaidExportResult?> ExecuteAsync(MermaidExportOptions options) {
             IReadOnlyList<Resource> resources = await _repository.GetAllOfTypeAsync<Resource>();
             return resources.ToMermaidDiagram(options);
         }

+ 11 - 22
RackPeek.Domain/UseCases/Mermaid/MermaidDiagramGenerator.cs

@@ -4,14 +4,11 @@ using System.Linq;
 using System.Text;
 using RackPeek.Domain.Resources;
 
-namespace RackPeek.Domain.UseCases.Mermaid
-{
-    public static class MermaidDiagramGenerator
-    {
+namespace RackPeek.Domain.UseCases.Mermaid {
+    public static class MermaidDiagramGenerator {
         public static MermaidExportResult ToMermaidDiagram(
             this IReadOnlyList<Resource> resources,
-            MermaidExportOptions? options = null)
-        {
+            MermaidExportOptions? options = null) {
             MermaidExportOptions resolvedOptions = options ?? new MermaidExportOptions();
             var sb = new StringBuilder();
             var warnings = new List<string>();
@@ -25,11 +22,9 @@ namespace RackPeek.Domain.UseCases.Mermaid
                 .GroupBy(r => r.Kind)
                 .OrderBy(g => g.Key);
 
-            foreach (IGrouping<string, Resource> group in grouped)
-            {
+            foreach (IGrouping<string, Resource> group in grouped) {
                 sb.AppendLine($"  subgraph {SanitizeId(group.Key)}");
-                foreach (Resource r in group.OrderBy(x => x.Name))
-                {
+                foreach (Resource r in group.OrderBy(x => x.Name)) {
                     var nodeId = SanitizeId(r.Name);
                     var label = BuildNodeLabel(r, resolvedOptions);
                     sb.AppendLine($"    {nodeId}[\"{label}\"]");
@@ -38,13 +33,10 @@ namespace RackPeek.Domain.UseCases.Mermaid
             }
 
             // Map RunsOn relationships if requested
-            if (resolvedOptions.IncludeEdges)
-            {
-                foreach (Resource r in resources)
-                {
+            if (resolvedOptions.IncludeEdges) {
+                foreach (Resource r in resources) {
                     var nodeId = SanitizeId(r.Name);
-                    foreach (var depName in r.RunsOn ?? new List<string>())
-                    {
+                    foreach (var depName in r.RunsOn ?? new List<string>()) {
                         var depId = SanitizeId(depName);
                         sb.AppendLine($"  {nodeId} --> {depId}");
                     }
@@ -57,8 +49,7 @@ namespace RackPeek.Domain.UseCases.Mermaid
             return new MermaidExportResult(sb.ToString().TrimEnd(), warnings);
         }
 
-        private static string BuildNodeLabel(Resource r, MermaidExportOptions options)
-        {
+        private static string BuildNodeLabel(Resource r, MermaidExportOptions options) {
             if (!options.IncludeLabels || r.Labels.Count == 0)
                 return r.Name;
 
@@ -70,11 +61,9 @@ namespace RackPeek.Domain.UseCases.Mermaid
             return labelParts.Count == 0 ? r.Name : $"{r.Name}\\n{string.Join("\\n", labelParts)}";
         }
 
-        private static string SanitizeId(string name)
-        {
+        private static string SanitizeId(string name) {
             var sb = new StringBuilder();
-            foreach (var ch in name.Trim().ToLowerInvariant())
-            {
+            foreach (var ch in name.Trim().ToLowerInvariant()) {
                 if (char.IsLetterOrDigit(ch) || ch == '_')
                     sb.Append(ch);
                 else if (ch == '-' || ch == '.' || ch == ' ')

+ 2 - 4
RackPeek.Domain/UseCases/Mermaid/MermaidExportOptions.cs

@@ -1,9 +1,7 @@
 using System.Collections.Generic;
 
-namespace RackPeek.Domain.UseCases.Mermaid
-{
-    public sealed record MermaidExportOptions
-    {
+namespace RackPeek.Domain.UseCases.Mermaid {
+    public sealed record MermaidExportOptions {
         /// <summary>
         /// Only include resources with these tags (optional)
         /// </summary>

+ 1 - 1
Shared.Rcl/CliBootstrap.cs

@@ -577,7 +577,7 @@ public static class CliBootstrap {
                 hosts.AddCommand<GenerateHostsFileCommand>("export")
                     .WithDescription("Generate a /etc/hosts compatible file.");
             });
-            
+
             // ----------------------------
             // Mermaid
             // ----------------------------

+ 8 - 16
Shared.Rcl/Commands/Exporters/GenerateMermaidDiagramCommand.cs

@@ -6,20 +6,17 @@ using Spectre.Console.Cli;
 namespace Shared.Rcl.Commands.Exporters;
 
 public sealed class GenerateMermaidDiagramCommand(IServiceProvider provider)
-    : AsyncCommand<GenerateMermaidDiagramSettings>
-{
+    : AsyncCommand<GenerateMermaidDiagramSettings> {
     public override async Task<int> ExecuteAsync(
         CommandContext context,
         GenerateMermaidDiagramSettings settings,
-        CancellationToken cancellationToken)
-    {
+        CancellationToken cancellationToken) {
         using IServiceScope scope = provider.CreateScope();
 
         MermaidDiagramExportUseCase useCase = scope.ServiceProvider
             .GetRequiredService<MermaidDiagramExportUseCase>();
 
-        var options = new MermaidExportOptions
-        {
+        var options = new MermaidExportOptions {
             IncludeTags = ParseCsv(settings.IncludeTags),
             DiagramType = settings.DiagramType ?? "flowchart TD",
             IncludeLabels = !settings.NoLabels,
@@ -29,22 +26,19 @@ public sealed class GenerateMermaidDiagramCommand(IServiceProvider provider)
 
         MermaidExportResult? result = await useCase.ExecuteAsync(options);
 
-        if (result is null)
-        {
+        if (result is null) {
             AnsiConsole.MarkupLine("[red]Mermaid export returned null.[/]");
             return -1;
         }
 
-        if (result.Warnings.Any())
-        {
+        if (result.Warnings.Any()) {
             AnsiConsole.MarkupLine("[yellow]Warnings:[/]");
             foreach (var warning in result.Warnings)
                 AnsiConsole.MarkupLine($"[yellow]- {Markup.Escape(warning)}[/]");
             AnsiConsole.WriteLine();
         }
 
-        if (!string.IsNullOrWhiteSpace(settings.OutputPath))
-        {
+        if (!string.IsNullOrWhiteSpace(settings.OutputPath)) {
             await File.WriteAllTextAsync(
                 settings.OutputPath,
                 result.DiagramText,
@@ -53,8 +47,7 @@ public sealed class GenerateMermaidDiagramCommand(IServiceProvider provider)
             AnsiConsole.MarkupLine(
                 $"[green]Mermaid diagram written to:[/] {Markup.Escape(settings.OutputPath)}");
         }
-        else
-        {
+        else {
             AnsiConsole.MarkupLine("[green]Generated Mermaid Diagram:[/]");
             AnsiConsole.WriteLine();
             AnsiConsole.Write(result.DiagramText);
@@ -63,8 +56,7 @@ public sealed class GenerateMermaidDiagramCommand(IServiceProvider provider)
         return 0;
     }
 
-    private static IReadOnlyList<string> ParseCsv(string? raw)
-    {
+    private static IReadOnlyList<string> ParseCsv(string? raw) {
         if (string.IsNullOrWhiteSpace(raw))
             return Array.Empty<string>();
 

+ 1 - 2
Shared.Rcl/Commands/Exporters/GenerateMermaidDiagramSettings.cs

@@ -3,8 +3,7 @@ using Spectre.Console.Cli;
 
 namespace Shared.Rcl.Commands.Exporters;
 
-public sealed class GenerateMermaidDiagramSettings : CommandSettings
-{
+public sealed class GenerateMermaidDiagramSettings : CommandSettings {
     [CommandOption("--include-tags")]
     [Description("Comma-separated list of tags to include (e.g. prod,linux)")]
     public string? IncludeTags { get; init; }