#nullable enable
using System.Runtime.ConstrainedExecution;
namespace Terminal.Gui;
internal abstract class AnsiResponseParserBase : IAnsiResponseParser
{
///
/// Responses we are expecting to come in.
///
protected readonly List<(string terminator, Action response)> expectedResponses = new ();
///
/// Collection of responses that we .
///
protected readonly List<(string terminator, Action response)> lateResponses = new ();
private AnsiResponseParserState _state = AnsiResponseParserState.Normal;
// Current state of the parser
public AnsiResponseParserState State
{
get => _state;
protected set
{
StateChangedAt = DateTime.Now;
_state = value;
}
}
///
/// When was last changed.
///
public DateTime StateChangedAt { get; private set; } = DateTime.Now;
protected readonly HashSet _knownTerminators = new ();
public AnsiResponseParserBase ()
{
// These all are valid terminators on ansi responses,
// see CSI in https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s
_knownTerminators.Add ('@');
_knownTerminators.Add ('A');
_knownTerminators.Add ('B');
_knownTerminators.Add ('C');
_knownTerminators.Add ('D');
_knownTerminators.Add ('E');
_knownTerminators.Add ('F');
_knownTerminators.Add ('G');
_knownTerminators.Add ('G');
_knownTerminators.Add ('H');
_knownTerminators.Add ('I');
_knownTerminators.Add ('J');
_knownTerminators.Add ('K');
_knownTerminators.Add ('L');
_knownTerminators.Add ('M');
// No - N or O
_knownTerminators.Add ('P');
_knownTerminators.Add ('Q');
_knownTerminators.Add ('R');
_knownTerminators.Add ('S');
_knownTerminators.Add ('T');
_knownTerminators.Add ('W');
_knownTerminators.Add ('X');
_knownTerminators.Add ('Z');
_knownTerminators.Add ('^');
_knownTerminators.Add ('`');
_knownTerminators.Add ('~');
_knownTerminators.Add ('a');
_knownTerminators.Add ('b');
_knownTerminators.Add ('c');
_knownTerminators.Add ('d');
_knownTerminators.Add ('e');
_knownTerminators.Add ('f');
_knownTerminators.Add ('g');
_knownTerminators.Add ('h');
_knownTerminators.Add ('i');
_knownTerminators.Add ('l');
_knownTerminators.Add ('m');
_knownTerminators.Add ('n');
_knownTerminators.Add ('p');
_knownTerminators.Add ('q');
_knownTerminators.Add ('r');
_knownTerminators.Add ('s');
_knownTerminators.Add ('t');
_knownTerminators.Add ('u');
_knownTerminators.Add ('v');
_knownTerminators.Add ('w');
_knownTerminators.Add ('x');
_knownTerminators.Add ('y');
_knownTerminators.Add ('z');
}
protected void ResetState ()
{
State = AnsiResponseParserState.Normal;
ClearHeld ();
}
public abstract void ClearHeld ();
protected abstract string HeldToString ();
protected abstract IEnumerable