generated from Nodarx/template
feat: initial version
Signed-off-by: Sebastian Krupinski <root@LAPTOP-7DVOR6NC>
This commit is contained in:
79
lib/Client/Protocol/Response/Parser/Lexer.php
Normal file
79
lib/Client/Protocol/Response/Parser/Lexer.php
Normal 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,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
24
lib/Client/Protocol/Response/Parser/ParseError.php
Normal file
24
lib/Client/Protocol/Response/Parser/ParseError.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Gricob\IMAP\Protocol\Response\Parser;
|
||||
|
||||
final class ParseError extends \Exception
|
||||
{
|
||||
/**
|
||||
* @param TokenType[] $expected
|
||||
*/
|
||||
public static function unexpectedToken(?TokenType $given, array $expected, string $input): self
|
||||
{
|
||||
return new self(
|
||||
sprintf(
|
||||
"Expected token of type %s. Given %s.\n%s",
|
||||
implode(
|
||||
' or ',
|
||||
array_map(fn (TokenType $type) => $type->name, $expected)
|
||||
),
|
||||
$given?->name ?? 'null',
|
||||
$input
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
1017
lib/Client/Protocol/Response/Parser/Parser.php
Normal file
1017
lib/Client/Protocol/Response/Parser/Parser.php
Normal file
File diff suppressed because it is too large
Load Diff
56
lib/Client/Protocol/Response/Parser/TokenType.php
Normal file
56
lib/Client/Protocol/Response/Parser/TokenType.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace Gricob\IMAP\Protocol\Response\Parser;
|
||||
|
||||
enum TokenType
|
||||
{
|
||||
case SP;
|
||||
case DOT;
|
||||
case ASTERISK;
|
||||
case PERCENT_SIGN;
|
||||
case PLUS_SIGN;
|
||||
case EQUALS_SIGN;
|
||||
case DOUBLE_QUOTE;
|
||||
case NUMBER;
|
||||
case ALPHANUMERIC;
|
||||
case NIL;
|
||||
case OPEN_BRACKETS;
|
||||
case CLOSE_BRACKETS;
|
||||
case OPEN_BRACES;
|
||||
case CLOSE_BRACES;
|
||||
case OPEN_PARENTHESIS;
|
||||
case CLOSE_PARENTHESIS;
|
||||
case BACKSLASH;
|
||||
case CRLF;
|
||||
case CTL;
|
||||
|
||||
case STATUS;
|
||||
|
||||
case APPENDUID;
|
||||
case UNSEEN;
|
||||
case UIDVALIDITY;
|
||||
case UIDNEXT;
|
||||
case PERMANENTFLAGS;
|
||||
case READ_WRITE;
|
||||
case READ_ONLY;
|
||||
|
||||
case CAPABILITY;
|
||||
case LIST;
|
||||
case FLAGS;
|
||||
case INTERNALDATE;
|
||||
case RECENT;
|
||||
case FETCH;
|
||||
case SEARCH;
|
||||
case EXISTS;
|
||||
case EXPUNGE;
|
||||
case BODY;
|
||||
case BODYSTRUCTURE;
|
||||
case ENVELOPE;
|
||||
case RFC822;
|
||||
case RFC822_SIZE;
|
||||
case RFC822_HEAD;
|
||||
case RFC822_TEXT;
|
||||
case UID;
|
||||
|
||||
case UNKNOWN;
|
||||
}
|
||||
Reference in New Issue
Block a user