|
7 | 7 | using DotnetInspector.Services; |
8 | 8 | using DotnetInspector.Views; |
9 | 9 | using Markout; |
| 10 | +using Markout.Formatting; |
10 | 11 |
|
11 | 12 | namespace DotnetInspector.Commands; |
12 | 13 |
|
@@ -68,12 +69,25 @@ public static async Task<int> ExecuteTypeDependsAsync(DependsOptions options) |
68 | 69 | else |
69 | 70 | { |
70 | 71 | var rootName = options.TargetType.Contains('<') ? options.TargetType : result.MatchedType!; |
71 | | - var view = new PackageDependenciesView |
| 72 | + var treeNodes = ToTreeNodes(result.Tree); |
| 73 | + |
| 74 | + if (options.MermaidOutput) |
72 | 75 | { |
73 | | - Title = rootName, |
74 | | - Dependencies = ToTreeNodes(result.Tree) |
75 | | - }; |
76 | | - MarkoutSerializer.Serialize(view, Console.Out, PackageDependenciesContext.Default); |
| 76 | + WriteMermaidTree(rootName, treeNodes); |
| 77 | + } |
| 78 | + else if (options.EmbeddedMermaid) |
| 79 | + { |
| 80 | + WriteEmbeddedMermaidTree(rootName, treeNodes); |
| 81 | + } |
| 82 | + else |
| 83 | + { |
| 84 | + var view = new PackageDependenciesView |
| 85 | + { |
| 86 | + Title = rootName, |
| 87 | + Dependencies = treeNodes |
| 88 | + }; |
| 89 | + MarkoutSerializer.Serialize(view, Console.Out, PackageDependenciesContext.Default); |
| 90 | + } |
77 | 91 | } |
78 | 92 |
|
79 | 93 | return 0; |
@@ -159,12 +173,23 @@ public static async Task<int> ExecuteLibraryDependsAsync(DependsOptions options) |
159 | 173 |
|
160 | 174 | var treeNodes = BuildNestedDependencyTree(refNodes); |
161 | 175 |
|
162 | | - var view = new PackageDependenciesView |
| 176 | + if (options.MermaidOutput) |
| 177 | + { |
| 178 | + WriteMermaidTree(assemblyName, treeNodes); |
| 179 | + } |
| 180 | + else if (options.EmbeddedMermaid) |
163 | 181 | { |
164 | | - Title = assemblyName, |
165 | | - Dependencies = treeNodes |
166 | | - }; |
167 | | - MarkoutSerializer.Serialize(view, Console.Out, PackageDependenciesContext.Default); |
| 182 | + WriteEmbeddedMermaidTree(assemblyName, treeNodes); |
| 183 | + } |
| 184 | + else |
| 185 | + { |
| 186 | + var view = new PackageDependenciesView |
| 187 | + { |
| 188 | + Title = assemblyName, |
| 189 | + Dependencies = treeNodes |
| 190 | + }; |
| 191 | + MarkoutSerializer.Serialize(view, Console.Out, PackageDependenciesContext.Default); |
| 192 | + } |
168 | 193 | return 0; |
169 | 194 | } |
170 | 195 | catch (Exception ex) |
@@ -253,12 +278,26 @@ public static async Task<int> ExecutePackageDependsAsync(DependsOptions options) |
253 | 278 | var depNodes = await DependencyResolutionService.ResolveDependencyTreeAsync( |
254 | 279 | context.HttpClient, group.Dependencies, tfm, globalSeen, logger.Log); |
255 | 280 |
|
256 | | - var view = new PackageDependenciesView |
| 281 | + var title = $"{packageName} ({version})"; |
| 282 | + var treeNodes = ToDependencyTreeNodes(depNodes); |
| 283 | + |
| 284 | + if (options.MermaidOutput) |
257 | 285 | { |
258 | | - Title = $"{packageName} ({version})", |
259 | | - Dependencies = ToDependencyTreeNodes(depNodes) |
260 | | - }; |
261 | | - MarkoutSerializer.Serialize(view, Console.Out, PackageDependenciesContext.Default); |
| 286 | + WriteMermaidTree(title, treeNodes); |
| 287 | + } |
| 288 | + else if (options.EmbeddedMermaid) |
| 289 | + { |
| 290 | + WriteEmbeddedMermaidTree(title, treeNodes); |
| 291 | + } |
| 292 | + else |
| 293 | + { |
| 294 | + var view = new PackageDependenciesView |
| 295 | + { |
| 296 | + Title = title, |
| 297 | + Dependencies = treeNodes |
| 298 | + }; |
| 299 | + MarkoutSerializer.Serialize(view, Console.Out, PackageDependenciesContext.Default); |
| 300 | + } |
262 | 301 | return 0; |
263 | 302 | } |
264 | 303 | catch (Exception ex) |
@@ -324,4 +363,36 @@ private static void BuildNestedNodes(List<AssemblyReferenceNode> nodes, ref int |
324 | 363 | target.Add(children.Count > 0 ? new TreeNode(label) { Children = children } : new TreeNode(label)); |
325 | 364 | } |
326 | 365 | } |
| 366 | + |
| 367 | + /// <summary> |
| 368 | + /// Writes standalone mermaid output using the MermaidFormatter. |
| 369 | + /// </summary> |
| 370 | + private static void WriteMermaidTree(string title, List<TreeNode> treeNodes) |
| 371 | + { |
| 372 | + var writer = MarkoutWriter.Create(Console.Out, new MermaidFormatter()); |
| 373 | + writer.WriteHeading(1, title); |
| 374 | + writer.WriteTree([.. treeNodes]); |
| 375 | + writer.Flush(); |
| 376 | + } |
| 377 | + |
| 378 | + /// <summary> |
| 379 | + /// Writes mermaid embedded in a markdown document (```mermaid code block). |
| 380 | + /// </summary> |
| 381 | + private static void WriteEmbeddedMermaidTree(string title, List<TreeNode> treeNodes) |
| 382 | + { |
| 383 | + var mdWriter = MarkoutWriter.Create(Console.Out, new MarkdownFormatter()); |
| 384 | + mdWriter.WriteHeading(1, title); |
| 385 | + |
| 386 | + // Render the mermaid content to a string |
| 387 | + var mermaidWriter = MarkoutWriter.Create(new MermaidFormatter()); |
| 388 | + mermaidWriter.WriteTree([.. treeNodes]); |
| 389 | + var mermaidContent = mermaidWriter.ToString(); |
| 390 | + |
| 391 | + mdWriter.WriteCodeStart("mermaid"); |
| 392 | + Console.Out.Write(mermaidContent); |
| 393 | + if (!mermaidContent.EndsWith('\n')) |
| 394 | + Console.Out.WriteLine(); |
| 395 | + mdWriter.WriteCodeEnd(); |
| 396 | + mdWriter.Flush(); |
| 397 | + } |
327 | 398 | } |
0 commit comments