feat: initial version

Signed-off-by: Sebastian Krupinski <root@LAPTOP-7DVOR6NC>
This commit was merged in pull request #1.
This commit is contained in:
Sebastian Krupinski
2026-02-20 16:41:19 -05:00
committed by Sebastian Krupinski
parent a313767846
commit e51c65bf19
139 changed files with 11256 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
<?php
namespace Gricob\IMAP\Protocol\Response\Parser;
use Doctrine\Common\Lexer\AbstractLexer;
/**
* @extends AbstractLexer<TokenType, string>
*/
class Lexer extends AbstractLexer
{
protected function getCatchablePatterns(): array
{
return [
'[a-zA-Z0-9\.\-]+',
'\r\n',
];
}
protected function getNonCatchablePatterns(): array
{
return [];
}
protected function getType(string &$value)
{
$normalizedValue = strtoupper($value);
return match($normalizedValue) {
' ' => TokenType::SP,
'.' => TokenType::DOT,
'*' => TokenType::ASTERISK,
'%' => TokenType::PERCENT_SIGN,
'+' => TokenType::PLUS_SIGN,
'=' => TokenType::EQUALS_SIGN,
'"' => TokenType::DOUBLE_QUOTE,
'[' => TokenType::OPEN_BRACKETS,
']' => TokenType::CLOSE_BRACKETS,
'{' => TokenType::OPEN_BRACES,
'}' => TokenType::CLOSE_BRACES,
'(' => TokenType::OPEN_PARENTHESIS,
')' => TokenType::CLOSE_PARENTHESIS,
'\\' => TokenType::BACKSLASH,
"\r\n" => TokenType::CRLF,
'NIL' => TokenType::NIL,
'OK', 'NO', 'BAD', 'BYE', 'PREAUTH' => TokenType::STATUS,
'APPENDUID' => TokenType::APPENDUID,
'UNSEEN' => TokenType::UNSEEN,
'UIDVALIDITY' => TokenType::UIDVALIDITY,
'UIDNEXT' => TokenType::UIDNEXT,
'PERMANENTFLAGS' => TokenType::PERMANENTFLAGS,
'READ-WRITE' => TokenType::READ_WRITE,
'READ-ONLY' => TokenType::READ_ONLY,
'CAPABILITY' => TokenType::CAPABILITY,
'LIST' => TokenType::LIST,
'FLAGS' => TokenType::FLAGS,
'RECENT' => TokenType::RECENT,
'FETCH' => TokenType::FETCH,
'INTERNALDATE' => TokenType::INTERNALDATE,
'SEARCH' => TokenType::SEARCH,
'EXISTS' => TokenType::EXISTS,
'EXPUNGE' => TokenType::EXPUNGE,
'BODY' => TokenType::BODY,
'BODYSTRUCTURE' => TokenType::BODYSTRUCTURE,
'ENVELOPE' => TokenType::ENVELOPE,
'RFC822' => TokenType::RFC822,
'RFC822.SIZE' => TokenType::RFC822_SIZE,
'RFC822.TEXT' => TokenType::RFC822_TEXT,
'RFC822.HEAD' => TokenType::RFC822_HEAD,
'UID' => TokenType::UID,
default => match (true) {
is_numeric($value) => TokenType::NUMBER,
ctype_alnum($value) => TokenType::ALPHANUMERIC,
ctype_cntrl($value) => TokenType::CTL,
default => TokenType::UNKNOWN,
},
};
}
}