private ReadInfo Read()
{
WritePromptIfNeeded();
var keyInfo = _console.Read();
if (keyInfo.Key == ConsoleKey.Backspace)
{
if (_cursorController.IsStartOfInput())
return new ReadInfo { KeyInfo = keyInfo };
OnBackspaceHit();
}
else if(keyInfo.Key == ConsoleKey.Delete)
{
if (_cursorController.IsEndOfInput())
return new ReadInfo { KeyInfo = keyInfo };
OnDeleteHit();
}
else if(keyInfo.Key == ConsoleKey.Home)
{
if(!_cursorController.IsStartOfInput())
_cursorController.MoveCursorToHome();
}
else if( keyInfo.Key == ConsoleKey.End)
{
if(!_cursorController.IsEndOfInput())
_cursorController.MoveCursorToEnd();
}
else if (keyInfo.Key == ConsoleKey.LeftArrow)
{
if (!_cursorController.IsStartOfInput())
_cursorController.MoveCursorBackward();
}
else if (keyInfo.Key == ConsoleKey.RightArrow)
{
if (!_cursorController.IsEndOfInput())
_cursorController.MoveCursorForward();
}
else if (keyInfo.Key == ConsoleKey.Enter)
{
var inputText = CurrentInput;
_cursorController.MoveCursorToStartOfNewLine();
return new ReadInfo {IsNewLine = true, KeyInfo = keyInfo, Text = inputText};
}
else if (keyInfo.IsPrintable())
{
var textAfterInput = ReadFromCursorToEndOfInput();
var returnPoint = _cursorController.CreateCursorReturnPoint();
_console.WriteAtCursorAndMove(keyInfo.KeyChar);
Write(textAfterInput, false);
returnPoint();
_cursorController.MoveCursorForward();
_cursorController.MoveLineMarkerForward();
}
_inputs.OnNext(keyInfo);
return new ReadInfo {KeyInfo = keyInfo, Text = keyInfo.KeyChar.ToString(CultureInfo.InvariantCulture)};
}