diff --git a/src/Stopwatch.App/StopwatchApplication.cs b/src/Stopwatch.App/StopwatchApplication.cs index 735367e..ef80183 100644 --- a/src/Stopwatch.App/StopwatchApplication.cs +++ b/src/Stopwatch.App/StopwatchApplication.cs @@ -10,6 +10,7 @@ public sealed class StopwatchApplication private readonly ICommandParser _commandParser; private readonly CommandHandler _commandHandler; private readonly StringBuilder _inputBuffer = new(); + private int _previousLineLength; public StopwatchApplication( IStopwatchService stopwatchService, @@ -31,9 +32,7 @@ public async Task RunAsync(CancellationToken cancellationToken) while (!cancellationToken.IsCancellationRequested && running) { var elapsed = await _stopwatchService.GetElapsedAsync(); - var formatted = FormatElapsed(elapsed); - - _console.Write($"\r{formatted} > {_inputBuffer} "); + RenderLine(elapsed); if (_console.KeyAvailable) { @@ -43,6 +42,7 @@ public async Task RunAsync(CancellationToken cancellationToken) { var command = _commandParser.Parse(_inputBuffer.ToString()); _inputBuffer.Clear(); + _previousLineLength = 0; _console.Write("\n"); @@ -55,10 +55,12 @@ public async Task RunAsync(CancellationToken cancellationToken) else if (key.Key == ConsoleKey.Backspace && _inputBuffer.Length > 0) { _inputBuffer.Length--; + RenderLine(elapsed); } else if (!char.IsControl(key.KeyChar)) { _inputBuffer.Append(key.KeyChar); + RenderLine(elapsed); } } @@ -77,6 +79,17 @@ public async Task RunAsync(CancellationToken cancellationToken) _console.Write("\n"); } + private void RenderLine(TimeSpan elapsed) + { + var formatted = FormatElapsed(elapsed); + var output = $"\r{formatted} > {_inputBuffer}"; + var padding = Math.Max(0, _previousLineLength - output.Length); + var paddedOutput = output + new string(' ', padding); + _previousLineLength = output.Length; + + _console.Write(paddedOutput); + } + private static string FormatElapsed(TimeSpan elapsed) { var days = (int)elapsed.TotalDays;