/// <summary>
/// Before PowerArgs parses the args, this hook inspects the command line for the indicator and if found
/// takes over the command line and provides tab completion.
/// </summary>
/// <param name="context">The context used to inspect the command line arguments.</param>
public override void BeforeParse(ArgHook.HookContext context)
{
if (CompletionSourceType != null &&
CompletionSourceType.GetInterfaces().Contains(typeof(ITabCompletionSource)) == false &&
CompletionSourceType.GetInterfaces().Contains(typeof(ISmartTabCompletionSource)) == false)
{
throw new InvalidArgDefinitionException("Type does not implement ITabCompletionSource or ISmartTabCompletionSource: " + CompletionSourceType.FullName);
}
if (context.Definition.IsNonInteractive)
{
this.REPL = false;
return;
}
if (Indicator == "" && context.CmdLineArgs.Length != 0)
{
this.REPL = false;
return;
}
if (Indicator != "" && (context.CmdLineArgs.Length != 1 || context.CmdLineArgs[0] != Indicator))
{
this.REPL = false;
return;
}
if (REPL && ShowREPLWelcome)
{
ConsoleString.Empty.WriteLine();
var message = REPLWelcomeMessage.Replace("{{Indicator}}", REPLExitIndicator);
ConsoleString.WriteLine(message, ConsoleColor.Cyan);
ConsoleString.Empty.WriteLine();
ConsoleString.Write(Indicator + "> ", ConsoleColor.Cyan);
ShowREPLWelcome = false;
}
else if (REPL)
{
ConsoleString.Write(Indicator + "> ", ConsoleColor.Cyan);
}
else
{
// This is a little hacky, but I could not find a better way to make the tab completion start on the same lime
// as the command line input
try
{
var lastLine = StdConsoleProvider.ReadALineOfConsoleOutput(Console.CursorTop - 1);
Console.CursorTop--;
Console.WriteLine(lastLine);
Console.CursorTop--;
Console.CursorLeft = lastLine.Length + 1;
}
catch (Exception)
{
Console.WriteLine();
Console.Write(Indicator + "> ");
}
}
PowerArgsRichCommandLineReader reader = new PowerArgsRichCommandLineReader(context.Definition, LoadHistory());
IHighlighterConfigurator customConfigurator;
if (HighlighterConfiguratorType.TryCreate <IHighlighterConfigurator>(out customConfigurator))
{
customConfigurator.Configure(reader.Highlighter);
}
var newCommandLineString = reader.ReadLine().ToString();
var newCommandLineArray = Args.Convert(newCommandLineString);
if (REPL && newCommandLineArray.Length == 1 && string.Equals(newCommandLineArray[0], REPLExitIndicator, StringComparison.OrdinalIgnoreCase))
{
throw new REPLExitException();
}
if (REPL && newCommandLineArray.Length == 1 && newCommandLineArray[0] == "cls")
{
ConsoleProvider.Current.Clear();
throw new REPLContinueException();
}
else if (REPL && newCommandLineArray.Length == 0 && string.IsNullOrWhiteSpace(REPLExitIndicator) == false)
{
throw new REPLContinueException();
}
context.CmdLineArgs = newCommandLineArray;
AddToHistory(newCommandLineString);
}