Skip to content

Commit

Permalink
Highjacking console when completing
Browse files Browse the repository at this point in the history
  • Loading branch information
JKamsker committed Jul 20, 2023
1 parent 4fa0659 commit 3214dee
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 0 deletions.
26 changes: 26 additions & 0 deletions src/Spectre.Console.Cli/Completion/HighjackedAnsiConsole.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
namespace Spectre.Console.Cli.Completion;

internal class HighjackedAnsiConsole : IAnsiConsole
{
public IAnsiConsole OriginalConsole { get; }

public HighjackedAnsiConsole(IAnsiConsole console)
{
OriginalConsole = console;
}

public Profile Profile => OriginalConsole.Profile;

public IAnsiConsoleCursor Cursor => OriginalConsole.Cursor;
public IAnsiConsoleInput Input => OriginalConsole.Input;
public IExclusivityMode ExclusivityMode => OriginalConsole.ExclusivityMode;
public RenderPipeline Pipeline => OriginalConsole.Pipeline;

public void Clear(bool home)
{
}

public void Write(IRenderable renderable)
{
}
}
25 changes: 25 additions & 0 deletions src/Spectre.Console.Cli/Completion/HighjackedTextWriter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace Spectre.Console.Cli.Completion;

internal class HighjackedTextWriter : TextWriter
{
public override Encoding Encoding => Encoding.UTF8;

public TextWriter OriginalWriter { get; }

public HighjackedTextWriter(TextWriter originalWriter)
{
OriginalWriter = originalWriter;
}

public override void Write(char value)
{
}

public override void Write(string? value)
{
}

public override void WriteLine(string? value)
{
}
}
20 changes: 20 additions & 0 deletions src/Spectre.Console.Cli/Internal/Commands/CompleteCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public sealed class Settings : CommandSettings

public override async Task<int> ExecuteAsync([NotNull] CommandContext context, [NotNull] Settings settings)
{
HighjackConsoles();

var commandToComplete = settings.CommandToComplete;
if (string.IsNullOrEmpty(commandToComplete))
{
Expand Down Expand Up @@ -372,4 +374,22 @@ private static string TrimOnce(string input, char character)

return input;
}

/// <summary>
/// Prevents arbitrary consoles from being used by the completion command. (For example, logging consoles).
/// </summary>
private static void HighjackConsoles()
{
try
{
System.Console.Clear();
}
catch
{
// Ignored
}

AnsiConsole.Console = new HighjackedAnsiConsole(AnsiConsole.Console);
System.Console.SetOut(new HighjackedTextWriter(System.Console.Out));
}
}

0 comments on commit 3214dee

Please sign in to comment.