LotSizingDataModel.Checker.Cli 2.0.1
Command-line interface for solution checking and validation workflows.
Loading...
Searching...
No Matches
CliProgressRenderer.cs
Go to the documentation of this file.
1using LotSizingDataModel.Checker.Campaign;
2
4
5internal sealed class CliProgressRenderer : IProgress<DirectoryVerificationCampaignProgress>
6{
7 private readonly object _sync = new();
8 private readonly bool _interactive;
9 private DirectoryVerificationCampaignStage? _lastStage;
10 private int _lastRenderedWidth;
11 private int _lastRedirectedFileCount = -1;
12 private int _lastRedirectedCandidateCount = -1;
13
15 {
16 _interactive = !Console.IsErrorRedirected;
17 }
18
19 public void Report(DirectoryVerificationCampaignProgress value)
20 {
21 ArgumentNullException.ThrowIfNull(value);
22
23 lock (_sync)
24 {
25 if (_interactive)
26 {
27 RenderInteractive(value);
28 }
29 else
30 {
31 RenderRedirected(value);
32 }
33
34 _lastStage = value.Stage;
35 }
36 }
37
38 public void CompleteLine()
39 {
40 lock (_sync)
41 {
42 if (_interactive && _lastRenderedWidth > 0)
43 {
44 Console.Error.WriteLine();
45 _lastRenderedWidth = 0;
46 }
47 }
48 }
49
50 private void RenderInteractive(
51 DirectoryVerificationCampaignProgress value)
52 {
53 string text = Format(value);
54 int padding = Math.Max(0, _lastRenderedWidth - text.Length);
55
56 Console.Error.Write('\r');
57 Console.Error.Write(text);
58
59 if (padding > 0)
60 {
61 Console.Error.Write(new string(' ', padding));
62 Console.Error.Write(new string('\b', padding));
63 }
64
65 _lastRenderedWidth = text.Length;
66
67 if (value.Stage == DirectoryVerificationCampaignStage.Completed)
68 {
69 Console.Error.WriteLine();
70 _lastRenderedWidth = 0;
71 }
72 }
73
74 private void RenderRedirected(
75 DirectoryVerificationCampaignProgress value)
76 {
77 bool stageChanged = _lastStage != value.Stage;
78
79 bool shouldWrite =
80 stageChanged ||
81 value.Stage == DirectoryVerificationCampaignStage.Completed;
82
83 if (value.Stage == DirectoryVerificationCampaignStage.LoadingFiles &&
84 value.ProcessedFileCount > 0 &&
85 (value.ProcessedFileCount == value.DiscoveredFileCount ||
86 value.ProcessedFileCount - _lastRedirectedFileCount >= 100))
87 {
88 shouldWrite = true;
89 _lastRedirectedFileCount = value.ProcessedFileCount;
90 }
91
92 if (value.Stage == DirectoryVerificationCampaignStage.VerifyingCandidates &&
93 value.CompletedCandidateCount > 0 &&
94 (value.CompletedCandidateCount == value.CandidateCount ||
95 value.CompletedCandidateCount - _lastRedirectedCandidateCount >= 25))
96 {
97 shouldWrite = true;
98 _lastRedirectedCandidateCount = value.CompletedCandidateCount;
99 }
100
101 if (shouldWrite)
102 {
103 Console.Error.WriteLine(Format(value));
104 }
105 }
106
107 private static string Format(
108 DirectoryVerificationCampaignProgress value)
109 {
110 return value.Stage switch
111 {
112 DirectoryVerificationCampaignStage.DiscoveringFiles =>
113 "Discovering XML files...",
114
115 DirectoryVerificationCampaignStage.LoadingFiles =>
116 $"Loading XML files: {value.ProcessedFileCount}/{value.DiscoveredFileCount} " +
117 $"(instances={value.LoadedInstanceCount})",
118
119 DirectoryVerificationCampaignStage.VerifyingCandidates =>
120 $"Checking candidates: {value.CompletedCandidateCount}/{value.CandidateCount}",
121
122 DirectoryVerificationCampaignStage.WritingReports =>
123 "Writing campaign reports...",
124
125 DirectoryVerificationCampaignStage.Completed =>
126 $"Campaign complete: candidates={value.CandidateCount}",
127
128 _ =>
129 value.Stage.ToString()
130 };
131 }
132}
void Report(DirectoryVerificationCampaignProgress value)